Ubuntu:重命名不同目录中的多个文件

时间:2018-04-29 10:46:48

标签: bash ubuntu rename

我需要重命名此结构中的文件:

lock = False

def dec(f):
    def wrapper(*args, **kwargs):
        global lock
        locked = lock
        if not locked:
            lock = True
            print('Start', f.__name__)
        result = f(*args, **kwargs)
        if not locked:
            lock = False
            print('End', f.__name__)
        return result
    return wrapper

新名称在1 dir中为1_01,1_02,在第2 dir中为2_01,2_02,依此类推......

有没有办法一次性完成...

目前,我正在使用:

Dir1
--file1
--file2
--  ... 
Dir2
--file1
--file2
--  ... 
... 
Dir62
--file1101
--file1102
--  ...

一次只能在1个目录中工作......

还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

如果运行此命令,它将使用 GNU Parallel 并行地在每个目录中启动一个新的bash shell,并在每个目录中运行ls并行独立:

parallel --dry-run -k 'cd {} && ls' ::: */

示例输出

cd Dir01/ && ls
cd Dir02/ && ls
cd Dir78/ && ls

如果您删除--dry-run,它将真实地执行此操作。

因此,现在让我们看一下在每个目录中使用ls命令,而不是运行rename。以下内容将重命名目录中的所有文件,并且顺序增加数字($N):

rename --dry-run '$_=$N' *

示例输出

'file87' would be renamed to '1'
'file88' would be renamed to '2'
'file89' would be renamed to '3'
'fred' would be renamed to '4'

所有上述内容都表明您想要的命令是:

parallel --dry-run -k 'cd {} && rename --dry-run "s/.*/{#}_\$N/" *' ::: */

您可以按原样运行它,它只会向您显示它将要执行的操作,而不会实际执行任何操作。

如果您喜欢它的外观,请删除第一个--dry-run并再次运行它,它将实际进入每个子目录并执行重命名的干运行,同样不会实际更改任何内容。

如果您仍然喜欢该命令的外观,请在临时目录中的某个位置制作一份小文件副本,如果符合您的需要,请尝试删除--dry-run个参数。

答案 1 :(得分:0)

ls -1 -d ./*/ | cat -n | xargs -I % bash -c 'echo "%" | while read dirnum dirname; do { ls "${dirname}" | cat -n | while read filenum filename; do { mv -v "${dirname}${filename}" "${dirnum}_${filenum}.png"; }; done }; done'

我们用mkdir和touch:

创建一个目录结构
mkdir Dir{1,2,3,4,5}
touch Dir{1,2,3,4,5}/file{1,2,3}

结果如下:

1_1.png
1_2.png
1_3.png
2_1.png
2_2.png
2_3.png
3_1.png
3_2.png
3_3.png
4_1.png
4_2.png
4_3.png
5_1.png
5_2.png
5_3.png