
У меня есть имена файлов в файле, который мне нужно удалить в другом каталоге.
Допустим, у меня есть x
и y
файлы в dir a
. Как мне удалить их с помощью cat?
Я пытался,
rm -f a/{`cat a.txt`}
a.txt
имеет содержание x,y,z
.
Если они находятся в одной папке, я могу вставить x y z
и a.txt
запустить,
rm -f `cat a.txt`
который отлично работает.
Я тоже пробовал,
rm -f "a/{"`cat a.txt`"}"
Эта команда будет помещена в dockerfile, поэтому я предпочитаю не использовать никаких переменных.
янехочу вставить a/x a/y a/z
файл, который может быть вариантом, так как он фиксированный, который a
будет содержать только файлы. Но a
должен быть изменен только в dockerfile. Спасибо за все предложения заранее :)
решение1
Вам следует использовать цикл while для чтения файла построчно, а затем применить каждую строку к rm
. Это очень распространенный и часто используемый подход в скриптах.
while IFS= read -r line
do
rm a/"$line"
done < file.txt
Естественно, формат файла должен представлять собой список файлов, по одному файлу на строку.
решение2
Не пытайтесь использовать его $(cat file)
для подобных целей — он сломается, если в именах файлов есть пробелы, например,
$ cat a.txt
foo
bar baz
bam
и
$ ls -Q a
"bam" "bar baz" "foo" "other file" "somefile"
затем
$ (cd a ; rm $(cat ../a.txt))
rm: cannot remove 'bar': No such file or directory
rm: cannot remove 'baz': No such file or directory
Вместо этого вы можете использоватьxargs
$ ls -Q a
"bam" "bar baz" "foo" "other file" "somefile"
$ xargs -a a.txt -I{} rm a/{}
$ ls -Q a
"other file" "somefile"
Если выДействительнохотите использовать cat
, то объедините его с xargs
:
cat a.txt | xargs -I{} rm a/{}
(хотя, учитывая эту -a
особенность, этоБесполезное использование кота)
Обратите внимание, что -I{}
подразумевается, -L 1
что ie rm
вызывается один раз для каждой строки входного файла; если вам не нужно добавлять путь к каталогу, то вы можете сделать команду более эффективной, убрав , -I
в этом случае xargs
будет передано несколько аргументов в rm
. Однако в этом случае вам следует явно задать разделитель ввода на новую строку, например, xargs -a a.txt -d '\n' rm
чтобы предотвратить разрыв на пробелах.
решение3
Если имена ваших файлов не содержат пробелов или специальных символов, просто повторно используйте исходную команду, добавив cd
перед ней символ :
(cd a; rm -f $(cat a.txt))
Имейте в виду, что rm -f `cat a.txt`
легко ломается из-за пробелов или любых специальных символов в именах файлов, поэтому вам следует использовать xargs
имена файлов, разделенные NUL.