用于收集所有指定文本文件、重命名它们并将它们复制到文件夹的命令

用于收集所有指定文本文件、重命名它们并将它们复制到文件夹的命令

我有数千个名为 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

使用findshell 脚本将路径转换为起始目录的相对路径并替换/_

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命令

相关内容