
別のディレクトリで削除する必要があるファイル名がファイル内にあります。
dir にファイルがあるx
とします。cat を使用してこれを削除するにはどうすればよいですか?y
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 でのみ変更する必要があります。事前にすべての提案に感謝します :)
答え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 1
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 で区切られたファイル名を使用する必要があります。