Предоставление вывода кошки к комнате

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

Скажем, я имею x и y файлы в dir a. Как я удаляю его с помощью кошки?

Я попробовал,

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. Спасибо за все предложения заранее :)

0
задан 28 June 2017 в 23:15

3 ответа

Принятие Ваших имен файлов не содержит пробелы или любые специальные символы, просто снова использует Вашу исходную команду с cd перед нею:

(cd a; rm -f $(cat a.txt))

быть предупрежденным, что rm -f `cat a.txt` повреждения легко с пробелами или любыми специальными символами в именах файлов, необходимо действительно использовать xargs с NUL-разграниченными именами файлов.

1
ответ дан 3 November 2019 в 00:45

Необходимо использовать цикл с условием продолжения, чтобы считать файл линию за линией и затем применить каждую строку к rm. Это очень общий и часто используемый подход в сценариях

while IFS= read -r line
do
       rm a/"$line"
done < file.txt

Естественно формат файла должно быть списком файлов с одним файлом на строку

2
ответ дан 3 November 2019 в 00:45

Не пытайтесь использовать $(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 функция, это - Бесполезное Использование CAT),


Отметьте это -I{} подразумевает -L 1 т.е. rm вызывается однажды для каждой строки входного файла; если Вы не должны предварительно ожидать путь к каталогу, то можно сделать команду более эффективной путем отказа -I в этом случае xargs передаст несколько аргументов rm. Однако в этом случае необходимо явно установить входной разделитель на новую строку, например. xargs -a a.txt -d '\n' rm предотвратить повреждение на пробелах.

1
ответ дан 3 November 2019 в 00:45

Другие вопросы по тегам:

Похожие вопросы: