读取和删除名称中包含空格的文件

时间:2019-10-15 12:58:46

标签: linux shell unix sh

我必须从文件A.txt中读取文件名列表,文件名中有空格,因此无法删除。文件A.txt如下所示

20150726140135_Content 1.mp4
20150726162955_Content 1.mp4
20150726163056_Content 3.mp4
20150726164057_Content 5.mp4
20150726170315_Tab main 2.mp4

for f in $(cat A.txt) ; do 
   rm "/tmp/$f";
done

尝试此操作时,文件分成两部分会导致错误

rm: cannot remove `/tmp/20150726170315_Tab': No such file or directory
rm: cannot remove `/tmp/2': No such file or directory

3 个答案:

答案 0 :(得分:3)

  

对于$(cat)中的i

是bash中常见的反模式。您不应该使用for循环来读取行。这不起作用,因为:

  1. 第一个$(cat A.txt)扩展为20150726140135_Content 1.mp4 20150726162955_Content 1.mp4 20150726163056_Content 3.mp4 20150726164057_Content 5.mp4 20150726170315_Tab main 2.mp4(无引号)。

  2. 然后shell执行命令for i in 20150726140135_Content 1.mp4 20150726162955_Content 1.mp4 20150726163056_Content 3.mp4 20150726164057_Content 5.mp4 20150726170315_Tab main 2.mp4。换行符和空格被解释为参数分隔符。

read a file line by line in bash,请使用while IFS= read -r循环:

while IFS= read -r f; do 
   rm "/tmp/$f";
done < A.txt

答案 1 :(得分:0)

您可以使用xargs。 -I'将使用基于行的输入。

xargs -i{} rm /tmp/{} < file.txt

答案 2 :(得分:-1)

如果您要删除以2015或其他任何格式开头的文件

while IFS='\s' read -r f; do 
   rm $f*;
done