【问题标题】:Unix find with spaces in filenamesUnix 查找文件名中的空格
【发布时间】:2013-04-17 07:02:07
【问题描述】:

我正在使用以下 shell 脚本循环遍历一个文本文件,然后删除与该文件名匹配的所有内容。

但是,如果文件名中包含空格,则它不起作用。如何纠正?理想情况下,我的脚本会查找并删除带空格和不带空格的文件名......

对此最受赞赏的任何其他改进。

这是在 OSX 中

提前感谢您的想法和建议,

$ cat delete-files.sh
#!/bin/sh

PATH=/bin:/usr/bin:/usr/sbin
export PATH

for i in `cat /opt/scripts/files-to-delete.dat` ;

do find /Volumes/folder/subfolder -iname $i -print -delete ;

done

还有文本文件:

$ cat files-to-delete.dat
LloydsTSB_Customer_Identification.html
Santander_Update_Process.html
asdasdasd asdasdasd.txt

【问题讨论】:

  • IFS=$'\n'; for l in $(cat) 执行路径名扩展,如果文件没有以换行符结尾,while IFS= read -r l 会跳过最后一行。见this answer

标签: macos shell find


【解决方案1】:

假设空白是字段分隔符,正在读取输入文件。将其更改为换行符,如下所示:

#!/bin/sh

PATH=/bin:/usr/bin:/usr/sbin
export PATH

IFS=$'\n'

for i in `cat /opt/scripts/files-to-delete.dat` ;

do find /Volumes/folder/subfolder -iname $i -print -delete ;

done

注意添加的 IFS=$'\n' 行。

【讨论】:

  • +1:当然,现在这会将问题转移到包含换行符的文件名上,但幸运的是,它们比包含空格的名称要少得多。 fordo 行之后的分号是多余的(尽管我注意到它们也在问题中;它们在那里也是多余的!)。
  • @btanaka 谢谢,这是完美的。这也很有意义。谢谢!
  • @JonathanLeffler,你是对的。我只是原封不动地保留了原始脚本并添加了 IFS 分配。从更大的意义上说,更正确地重新编写脚本可能会更有帮助。无论如何,你是对的!
【解决方案2】:

for i in $(cat filenames) 是个坏主意,这正是您遇到的原因。更多信息可以在herehere 找到,但总之:

while IFS= read -r line; do stuff_with "$line"; done < "$file"

总是是正确的解决方案。 (注意:如果您的任何文件名包含换行符,此仍然会失败;在这种情况下,您自己删除它们可能更容易。)

【讨论】:

  • 恐怕我不清楚如何将您的建议转换为我的脚本。我也怀疑你的意思是 while IFS= read -r aline;对吗?
  • @JonathanLeffler 我的错。我从链接 #1 转录失败。我会编辑。
【解决方案3】:

感谢 Lauri Ranta 指出最优雅的解决方案:

#!/bin/sh

PATH=/bin:/usr/bin:/usr/sbin
export PATH

while IFS= read -r line

do find /Volumes/folder/subfolder -iname "$line" -print -delete

done < "/tmp/files-to-delete.dat"

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 2018-04-08
    • 2018-09-22
    • 2018-05-18
    • 2013-02-07
    • 2015-11-08
    • 2011-12-15
    • 2012-05-28
    相关资源
    最近更新 更多