![需要有关命令行中文件复制的帮助](https://linux22.com/image/1127248/%E9%9C%80%E8%A6%81%E6%9C%89%E5%85%B3%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%AD%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E7%9A%84%E5%B8%AE%E5%8A%A9.png)
我有一个文件夹,大小高达 700 GB,其中一些文件是重复的。很多文件都同名,有些是重复的,有些不是。基本上,这个文件夹中有大约 30 个文件夹,里面装满了文件和更多文件夹。我想以递归方式抓取这个 700 GB 文件夹中的所有文件,然后以非递归方式将其复制到另一个目录。任何冲突都将根据大小处理。如果两个文件具有相同的名称和大小,则会跳过该文件,但是,如果两个文件具有相同的名称并且大小不同,则会保留这两个文件。有什么方法可以做到这一点?
答案1
这是一个复杂的问题,因为重复项必须重命名,而且改名必须根据大小检查所有(可能)先前已重命名的“同伴”的重复项。
它能做什么
据我所知(和测试),下面的脚本可以做到这一点。它将可能的重复项重命名为等[dupe_1]<file>
([dupe_1]<file>
如果它们的大小不同),并在每次重命名后检查文件的大小是否与目标目录中移动的重复项或其重命名的版本匹配。
#!/usr/bin/env python3
import shutil
import os
#--- set the directory, the same as the first script
dr = "/path/to/recursive/source_directory"
dr2 = "/path/to/flat/target_directory"
#---
def check_dupe(src, trg):
return os.stat(src).st_size == os.stat(trg).st_size
for root, dirs, files in os.walk(dr):
for file in files:
# define src, target
src = root+"/"+file; trg = dr2+"/"+file
if not os.path.exists(trg):
# if target does not exist: move file
shutil.copy(src, trg)
else:
n = 1
# rename the file, check after every renaming if file exists, if size differs
while os.path.exists(trg):
test = check_dupe(src, trg)
if test != True:
trg = dr2+"/[dupe_"+str(n)+"]"+file
n += 1
else:
break
if test != True:
shutil.copy(src, trg)
如何使用
- 将脚本复制到一个空文件中,另存为
reorganize.py
- 在脚本的头部,设置源目录和目标目录的路径
通过命令运行:
python3 /path/to/reorganize.py
笔记
- 请先在小样本上进行测试
- 请记住,这可能会造成巨大的“平面”目录,nautilus 无法浏览该目录。
答案2
尝试这个:
cd [folder_name]
for file in ./*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
do
if [ -e [destination_folder]/"$file" ]; then
if [ `du -s "$file" | cut -d ' ' -f 1` -eq `du -s [destination_folder]/"$file" | cut -d ' ' -f 1` ]; then
false
else
cp "$file" [destination_folder]/"$file"...
fi
else
cp "$file" [destination_folder]/
fi
echo "$file copied"
done