来自文件文本列表的 Linux(mv 或 cp)特定文件?

Jes*_*tep 42 linux files cp mv

我有一个包含许多文件的目录,例如服务器上的 50,000 个 pdf 和其他文件。我需要将特定的移动到另一个目录。我可以生成需要以 csv 或任何其他文本格式移动的文件列表。

我需要做的是运行 bash 脚本并将文本文件中列出的文件移动或复制到另一个目录。

有没有简单的方法来做到这一点?任何建议或资源将不胜感激。

Den*_*son 39

为了避免无用的使用cat(如果你不使用rsync):

xargs -a file_list.txt mv -t /path/to/dest
Run Code Online (Sandbox Code Playgroud)

这将处理任何有效的文件名,除非它包含换行符,如果文件每行列出一个。

  • 这种方法的一个缺点是,如果列表中的文件包含路径名(即它们不在同一目录中),则使用 `mv` 会将它们全部折叠到同一目标目录中。已接受答案中的“rsync”方法不受此限制。 (2认同)

Ign*_*ams 38

rsync的具有可采取文件的列表,以过程(几个选项--files-from--include-from等等)。

例如,这可以解决问题:

rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
Run Code Online (Sandbox Code Playgroud)

  • 如果文件列表包含绝对路径,请使用“/”作为源目录。 (3认同)
  • -a 通常意味着 -r,但在使用“--files-from”选项时*不是*。对于递归行为,您还需要显式添加 -r 选项,如“rsync -ar /source/director --files-from=/full/path/to/listfile /destination/directory” (3认同)
  • 例如:```rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory``` (2认同)
  • 如果您不想保留路径并使其平坦,则还必须使用 --no-relative。 (2认同)

Mad*_*ter 17

for file in `cat listoffiles`; do mv "$file" /path/of/destination ; done
Run Code Online (Sandbox Code Playgroud)

假设 bash,加上listoffiles每行包含一个文件。我对 rsync 路由的唯一反对是 OP 要求一种移动文件的方法,而不是复制它们。rsync 比皇室婚礼有更多的标志,所以我相信它可以进一步修改来做到这一点,但有时更简单更好!

  • 不错,只是我有空格问题,所以我将其修改为:`while read -r file; 做 mv "$file" /path/of/destination ; 完成 < listfiles` (5认同)

小智 5

rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/
Run Code Online (Sandbox Code Playgroud)

Rsync 比cpormv命令有额外的好处,因为如果文件夹不存在,它会自动创建文件夹。