我有 535 个文件夹(recup_dir.1
、、recup_dir.2
...、recup_dir.535
),我想将这些文件夹的内容合并(组合?)到一个文件夹中(假设文件夹名为recup_dir
)。某些文件可能具有相同的名称(例如img.jpg
),它们不应覆盖现有文件(而应将它们重命名为,例如img1.jpg
,img2.jpg
等等...)。
有没有办法使用命令行来做这样的事情?
答案1
下面的脚本将所有文件从一个目录(包含 535 个文件夹)(递归地)移动到另一个(单个)目录,并保留其原始文件名。
如果有重复
(仅)在名称重复的情况下,文件将重命名为等duplicate_1_[filename]
。duplicate_2_[filename]
如何使用
将以下脚本复制到一个空文件中,将其另存为rearrange.py
,设置源和目标(目录)的正确路径,然后运行它:
python rearrange.py
剧本:
#!/usr/bin/env python
import os
import shutil
# --------------------------------------------------------
reorg_dir = "/path/to/sourcedirectory"
target_dir = "/path/to/destination"
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
n = 1; name_orig = name
while os.path.exists(target_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig; n = n+1
newfile = target_dir+"/"+name; shutil.move(subject, newfile)
对于(gnome-)终端的“拖放”功能:
使用以下版本,按上述方法保存(但不要更改任何内容)并使其可执行。要使用它,请打开终端窗口,将脚本拖到终端窗口上,然后拖到源目录,最后拖到目标目录。然后您将在终端中看到以下命令:
rearrange.py /path/to/source /path/to/destination
按回车键就完成了。
剧本:
#!/usr/bin/env python
import os
import shutil
import sys
# --------------------------------------------------------
reorg_dir = sys.argv[1]
target_dir = sys.argv[2]
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
n = 1; name_orig = name
while os.path.exists(target_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig; n = n+1
newfile = target_dir+"/"+name; shutil.move(subject, newfile)
复制而不是移动
如果你想保持当前目录不变,并且只复制将文件放入新目录中,只需替换最后一行(部分):
代替:
shutil.move(subject, newfile)
经过:
shutil.copy(subject, newfile)
答案2
sudo cp -r --backup=t recup_dir.*/* recup_dir
此命令将复制所有 535 文件夹的内容并将recup_dir
现有文件重命名为file.~1~ file.~2~ ..
535 文件夹及其内容仍将存在,如果您想在复制后删除它们,只需添加&& sudo rm -rf recup_dir.*
在第一个命令之后,它看起来像:
sudo cp -r --backup=t recup_dir.*/* recup_dir && sudo rm -rf recup_dir.