将文件列表(在文本文件中)移动到目录?

Ste*_*eve 9 bash mv

我有一个文件列表,带有它们的完整路径,文件“files.txt”中每行一个

我试图将所有这些文件从它们的原始位置移动到一个新目录。

我 CD 进入他们现在居住的目录并发出

for file in ~/Desktop/files.txt do mv $file ~/newfolder

但什么也没有发生。我确定我遗漏了一些明显的东西

Nif*_*fle 12

bash 不会读取文件的内容,除非你告诉它。

for file in $(cat ~/Desktop/files.txt); do mv "$file" ~/newfolder; done
Run Code Online (Sandbox Code Playgroud)

  • 这仍然会中断包含空格的文件名。由于 `IFS` 被设置为任何空格,像 `Quarterly report.pdf` 这样的文件名将在上面失败,_即使_ `$file` 被引用,因为 Bash 将在空格上拆分循环参数:第一个 `$file` 将包含 `"Quarterly"` 并且在下一次迭代中它将包含 `"report.pdf"`。一种解决方法是设置`IFS='\n'`,但在`< files.txt` 版本中已经存在故障安全解决方案。这是学习人们这样循环不好的原因之一,因为它迟早_会_中断。 (3认同)
  • cat 的无用使用,并且您的脚本以多种方式中断,即使文件的路径中仅包含一个空格。请修复此问题,因为这是导致问题的常见原因。 (2认同)

ter*_*don 6

你需要告诉你的循环读取文件,否则它只是在执行:

mv ~/Desktop/files.txt ~/newfolder
Run Code Online (Sandbox Code Playgroud)

此外,正如 nerdwaller 所说,您需要分隔符。尝试这个:

while read file; do mv "$file" ~/newfolder; done < ~/Desktop/files.txt
Run Code Online (Sandbox Code Playgroud)

如果您的路径或文件名包含空格或其他奇怪的字符,您可能需要这样做:

while IFS= read -r file; do mv "$file" ~/newfolder; done < ~/Desktop/files.txt
Run Code Online (Sandbox Code Playgroud)

注意变量"周围的引号$file


gle*_*man 5

如果文件名不包含空格:

mv -t dest_dir $(< text.file)
Run Code Online (Sandbox Code Playgroud)

可能是最简洁的方式。

如果文件名中有空格

while IFS= read -r filename; do mv "$filename" dest_dir; done < test.file
Run Code Online (Sandbox Code Playgroud)

是安全的。