我正在使用以下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
答案 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)
是一个坏主意,正是因为你遇到的原因。可以找到更多信息here和here,但简而言之:
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"