catの出力をrmに渡す

catの出力をrmに渡す

別のディレクトリで削除する必要があるファイル名がファイル内にあります。

dir にファイルがあるxとします。cat を使用してこれを削除するにはどうすればよいですか?ya

私は試した、

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ファイルのみが含まれるように固定されています。ただし、adockerfile でのみ変更する必要があります。事前にすべての提案に感謝します :)

答え1

whileループを使用してファイルを1行ずつ読み取り、各行を適用する必要がありますrm。これはスクリプトで非常に一般的で頻繁に使用されるアプローチです。

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

当然、ファイルの形式は1行に1つのファイルを含むファイルのリストである必要があります。

答え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機能を考えると、猫の無駄遣い


は、入力ファイルの各行に対してieが 1 回呼び出される-I{}ことを意味します。ディレクトリ パスを先頭に追加する必要がない場合は、 をなくすことでコマンドをより効率的にすることができます。この場合、 は に複数の引数を渡します。ただし、その場合は、スペースで分割されないように、入力区切り文字を明示的に改行 (例: ) に設定する必要があります。-L 1rm-Ixargsrmxargs -a a.txt -d '\n' rm

答え3

ファイル名にスペースや特殊文字が含まれていないと仮定すると、元のコマンドのcd前に を付けて再利用するだけです。

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

rm -f `cat a.txt`ファイル名にスペースや特殊文字が含まれると簡単に壊れてしまうので注意してください。実際にはxargsNUL で区切られたファイル名を使用する必要があります。

関連情報