Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Unix查找文件名中包含空格_Macos_Shell_Find - Fatal编程技术网

Macos Unix查找文件名中包含空格

Macos Unix查找文件名中包含空格,macos,shell,find,Macos,Shell,Find,我使用下面的shell脚本循环遍历文本文件,然后删除与文件名匹配的任何内容 但是,如果文件名中有空格,则它不起作用。如何纠正这一点?理想情况下,我的脚本将查找和删除带空格和不带空格的文件名 对此的任何其他改进都是非常值得赞赏的 这是在OSX中 提前感谢您的想法和建议 丹 和文本文件: $ cat files-to-delete.dat LloydsTSB_Customer_Identification.html Santander_Update_Process.html asdasdasd as

我使用下面的shell脚本循环遍历文本文件,然后删除与文件名匹配的任何内容

但是,如果文件名中有空格,则它不起作用。如何纠正这一点?理想情况下,我的脚本将查找和删除带空格和不带空格的文件名

对此的任何其他改进都是非常值得赞赏的

这是在OSX中

提前感谢您的想法和建议

和文本文件:

$ cat files-to-delete.dat
LloydsTSB_Customer_Identification.html
Santander_Update_Process.html
asdasdasd asdasdasd.txt
因为$cat文件名中的i是个坏主意,这正是您遇到的原因。可以找到更多信息,但简而言之:

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

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

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

#!/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'行。

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

恐怕我不清楚如何把你的建议转换成我的剧本。我还怀疑你的意思是IFS=read-r aline;“对吗?”乔纳坦利弗勒说,“我的错。”。我从链接1转录失败。我会编辑。+1:当然,这会将问题转移到包含换行符的文件名上,但幸运的是,它们比包含空格的文件名少得多。for和do行后面的分号是多余的,尽管我注意到它们也在问题中;它们在那里也是多余的@谢谢,这太完美了。这也是有道理的。谢谢@乔纳森·莱弗勒,你说得对。我只是将原始脚本原封不动地保留下来,并添加了IFS任务。从更大的意义上讲,重新编写更正确的脚本可能会更有帮助。无论如何,你是对的!IFS=$'\n';对于l,在$cat中执行路径名扩展,当IFS=read-r时,如果文件没有以换行符结尾,则l跳过最后一行。看见
#!/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"