我必须从文件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
答案 0 :(得分:3)
对于$(cat)中的i
是bash中常见的反模式。您不应该使用for循环来读取行。这不起作用,因为:
第一个$(cat A.txt)
扩展为20150726140135_Content 1.mp4
20150726162955_Content 1.mp4
20150726163056_Content 3.mp4
20150726164057_Content 5.mp4
20150726170315_Tab main 2.mp4
(无引号)。
然后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