我需要重命名此结构中的文件:
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个目录中工作......
还有更好的方法吗?
答案 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