0

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

3 回答 3

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' 行。

于 2013-04-23T22:36:40.920 回答
3

for i in $(cat filenames)正是由于您遇到的原因,这是一个坏主意。可以在此处此处找到更多信息,但简而言之:

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

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

于 2013-04-23T22:14:23.420 回答
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"
于 2013-04-25T17:51:39.397 回答