从文件列表中查找并在 Unix 中移动

从文件列表中查找并在 Unix 中移动

我有一个包含文件名的列表文件,我想一次从列表中读取一个文件名,并在具有多个子文件夹的目录结构下查找它,然后找到后将其移动到 diff 文件夹中。

前任:

listfile.txt

Content of the file--
filename1.txt
filename2.txt

maindir
|--subdir1
|---subdir2/filename1.txt
|---subdir3/filename2.txt

从 listfile.txt 中一一读取文件名并将它们移动到 diff 文件夹(例如 /destfolder)。

任何建议都会很棒。

谢谢,卡文

答案1

使用 shell 循环并find为每个文件名调用一次:

mkdir -p archive_dir
while IFS= read -r filename; do
    find maindir -type f -name "$filename" -exec mv {} archive_dir ';'
done <listfile.txt

这会稍微低效,因为即使在找到文件后它也会继续寻找匹配的文件名(如果它找到另一个文件,它会覆盖已经移动的那个)。

如果使用 GNU find,您可以添加到命令-quit的最后find,以使find进程在移动第一个文件后停止。

显示它的工作原理:

$ cat listfile.txt
filename1.txt
filename2.txt
.
|-- listfile.txt
`-- maindir
    |-- subdir1
    |-- subdir2
    |   `-- filename1.txt
    `-- subdir3
        `-- filename2.txt

4 directories, 3 files

(运行上面的循环)

然后:

.
|-- archive_dir
|   |-- filename1.txt
|   `-- filename2.txt
|-- listfile.txt
`-- maindir
    |-- subdir1
    |-- subdir2
    `-- subdir3

5 directories, 3 files

有关的:

相关内容