削除する必要のある一連のファイル名をエクスポートしたファイルがあります。コマンドラインで一度に1つずつ発行せずに、各ファイルを削除する方法を知る必要があります。
私はそれをfor
ループの内側に配置することを考えましたが、これはおそらく機能しますが、これを行うためのより簡単な、またはより良い解決策があるかどうかを知りたいと思っていました。
ありがとう。
rm -rf `cat /path/to/filename`
``文字は$()で置き換えることができます
bashのmanページから:
Command Substitution
Command substitution allows the output of a command to replace the command
name. There are two forms:
$(command)
or
`command`
Bash performs the expansion by executing command and replacing the command
substitution with the standard output of the command, with any trailing
newlines deleted. Embedded newlines are not deleted, but they may be
removed during Word splitting. The command substitution $(cat file) can
be replaced by the equivalent but faster $(< file).
When the old-style backquote form of substitution is used, backslash
retains its literal meaning except when followed by $, `, or \. The first
backquote not preceded by a backslash terminates the command substitution.
When using the $(command) form, all characters between the parentheses
make up the command; none are treated specially.
Command substitutions may be nested. To nest when using the backquoted
form, escape the inner backquotes with backslashes.
If the substitution appears within double quotes, Word splitting and path‐
name expansion are not performed on the results.
cat
やループは必要ありません。
xargs -d '\n' -a file.list rm
$ cat file.list | xargs rm
while read filename ; do rm "$filename" ; done < files.lst
Perl -lne 'unlink' files_to_remove.txt
たくさんのファイルを削除する必要がある場合、これはxargs + rmの数倍、シェルループの何倍も高速です。
なんと言っても、ファイルをスクリプトにして実行するだけで、空白や他のほとんどの扱いにくい文字を処理でき、簡単です。上記のメソッドのほとんどより多くのプロセスを生成しません。
sed -ie 's/^/rm -f "/;s/$/"/' <filename>
sh <filename>
最高のものではありませんが、動作します-:)
cat myfile | awk '{print "rm -rf " $0}' | bash
現在の回答で十分です。ただし、ファイルが多すぎるとxargsは失敗する可能性があります。その場合、なんらかのループが必要になります。
また、この種のことを実行するときは、ファイルを削除するのではなく別のフォルダに移動することをお勧めします。これにより、一部の奇妙なファイル名に何らかのミスがないことを手動で確認できます。次に、問題がなければ、フォルダを削除します。
もう1つ:xargs rm < /path/to/file
(1行に1つのファイル名がある場合に機能します)