我有数千个名为 file.txt 的文本文件。因为它们都共享相同的名称,所以我无法将它们移动到同一个文件夹而不覆盖它们。
我需要一个命令来查找数千个目录和子目录中的所有 file.txt 文件,将完整路径名附加到文件名末尾,然后复制到指定的文件夹,而保留原始文件夹的位置。
例子:
from: file.txt
to: a/123/file.txt
(我知道 / 不能在文件名中使用,因此连字符或下划线可以使用,除非有视觉上更合适的替换)
此外,该命令需要忽略大小写,因为有些是 file.txt,有些是 File.txt,并且末尾还有一个可选的“S”(file.txt 或 files.txt)。
在重命名期间,我希望路径可以按原样附加,而无需更改大小写,因为目录/子目录名称是随机的(例如:a/adgDGeRddsdvvsdGSD/[fF]ile[s].txt
谢谢!
答案1
使用find
shell 脚本将路径转换为起始目录的相对路径并替换/
为_
:
find . -type f -iname 'file*.txt' -exec sh -c '
targetdir=$1; shift
for file; do
cp "$file" "$targetdir/$(realpath --relative-base=. "$file" | tr '/' '_')"
# uncomment to restrict the filename to the last 4 directories
#cp "$file" "$targetdir/$(realpath --relative-base=. "$file" |
# rev | cut -d'/' -f-5 | rev | tr '/' '_')"
done
' sh /tmp/dest {} +
在运行命令之前替换/tmp/dest
为您的目标目录和cd
文件的父目录。
输入目录结构示例:
.
├── dir1
│ ├── file.txt
│ └── sub1
│ └── file.txt
├── dir2
│ └── file.txt
└── file.txt
输出/tmp/dest
:
dir1_file.txt
dir1_sub1_file.txt
dir2_file.txt
file.txt
答案2
我会这样做:
while read -r file; do mv $file /path/to/dir/$(echo $file | tr '/' '_'); done < <(find / -name *.txt -type f 2>/dev/null)
这将循环遍历命令的所有结果find
并将它们移动到所需的目录。
如果你想复制它们,你可以使用cp
命令