【问题标题】:Shell Script Find and Copy from txt fileShell 脚本从 txt 文件中查找和复制
【发布时间】:2023-04-05 17:47:02
【问题描述】:

我想从文本文件中逐行读取以递归查找目标文件夹中的文件。如果找到将该文件复制到另一个目录。下面的脚本在从终端运行sh script.sh 时执行但不执行查找或复制。不显示任何错误,它将为每个循环迭代正确地回显$line 变量字符串。使用实际文件名而不是 $list 变量从终端运行相同的 find 确实可以成功完成任务。

脚本:

script.sh
#!/bin/bash
file="filenames.txt"
while IFS= read line
do
find /Volumes/share/all-files-location -name "$line" -print -exec cp {} /Volumes/share/found-files-location \;
done < "$file"

文件名列表,纯文本:

A1037_MG_1262.jpg
A1037_MG_12621.jpg
A1037_MG_1263.jpg
[11,000 more entries]

想法?

【问题讨论】:

  • 这似乎在我的机器上运行良好,将路径和文件名调整为启动驱动器上实际存在的内容。您确定所有路径都正确吗?
  • 另外,任何有问题的文件的路径是否包含空格或其他不寻常的字符?
  • 要复制的文件中没有空格。将我的脚本调整为 "find ~/Desktop/test-folder/all-web-photos -name "$line" -print -exec cp {} ~/Desktop/test-folder/found \;"也不起作用,再次没有错误。在终端窗口中使用文件名而不是变量运行 find 命令确实可以正确执行,因此我的路径肯定是正确的。
  • 输入文件使用什么行结尾? CR、LF、CRLF?
  • 输入文件使用CRLF

标签: macos shell sh


【解决方案1】:

由于输入文件在 CRLF 中,并且 Unix 通常使用 LF 作为其行尾,因此 bash 脚本会根据 LF 字符的出现对行进行排序,因此您的每个文件名都在末尾附加了 \r其中。由于您的磁盘可能不包含包含\r 的文件名,因此find 工具没有找到任何文件,结果是您的工具似乎失败并且没有给出错误消息。

解决方案:将文件的行结束格式切换为 LF。

【讨论】:

    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多