Чтение и удаление файлов, содержащих пробел в его имени - PullRequest
0 голосов
/ 15 октября 2019

Мне нужно прочитать список имен файлов из файла 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 ]

3 голосов
/ 15 октября 2019

для i in $ (cat)

- это обычный антипаттерн в 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. Затем оболочка выполняеткоманда for i in 20150726140135_Content 1.mp4 20150726162955_Content 1.mp4 20150726163056_Content 3.mp4 20150726164057_Content 5.mp4 20150726170315_Tab main 2.mp4. Символы новой строки и пробелы интерпретируются как разделители аргументов.

Чтобы читать файл построчно в bash использовать цикл while IFS= read -r:

while IFS= read -r f; do 
   rm "/tmp/$f";
done < A.txt
0 голосов
/ 15 октября 2019

, если вы хотите удалить файлы, начинающиеся с 2015 года, или любой другой шаблон

while IFS='\s' read -r f; do 
   rm $f*;
done
0 голосов
/ 15 октября 2019

Вы можете использовать xargs. -I 'будет использовать строчный ввод.

xargs -i{} rm /tmp/{} < file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...