Даем вывод cat в rm

Даем вывод cat в rm

У меня есть имена файлов в файле, который мне нужно удалить в другом каталоге.

Допустим, у меня есть 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.

Связанный контент