Unix在文件名中找到空格

时间:2013-04-23 22:03:11

标签: macos shell find

我正在使用以下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

3 个答案:

答案 0 :(得分:4)

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

#!/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 :(得分:3)

for i in $(cat filenames)是一个坏主意,正是因为你遇到的原因。可以找到更多信息herehere,但简而言之:

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

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

答案 2 :(得分:0)

感谢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"