web-dev-qa-db-ja.com

テキストファイルにリストされているファイルを削除する

削除する必要のある一連のファイル名をエクスポートしたファイルがあります。コマンドラインで一度に1つずつ発行せずに、各ファイルを削除する方法を知る必要があります。

私はそれをforループの内側に配置することを考えましたが、これはおそらく機能しますが、これを行うためのより簡単な、またはより良い解決策があるかどうかを知りたいと思っていました。

ありがとう。

6
drewrockshard
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.
5
bclermont

catやループは必要ありません。

xargs -d '\n' -a file.list rm
$ cat file.list | xargs rm
7
EEAA
while read filename ; do rm "$filename" ; done < files.lst
Perl -lne 'unlink' files_to_remove.txt

たくさんのファイルを削除する必要がある場合、これはxargs + rmの数倍、シェルループの何倍も高速です。

4
Pontus

なんと言っても、ファイルをスクリプトにして実行するだけで、空白や他のほとんどの扱いにくい文字を処理でき、簡単です。上記のメソッドのほとんどより多くのプロセスを生成しません。

sed -ie 's/^/rm -f "/;s/$/"/' <filename>
sh <filename>
1
Jason Tan

最高のものではありませんが、動作します-:)

cat myfile | awk '{print "rm -rf " $0}' | bash
0
Daniel t.

現在の回答で十分です。ただし、ファイルが多すぎるとxargsは失敗する可能性があります。その場合、なんらかのループが必要になります。

また、この種のことを実行するときは、ファイルを削除するのではなく別のフォルダに移動することをお勧めします。これにより、一部の奇妙なファイル名に何らかのミスがないことを手動で確認できます。次に、問題がなければ、フォルダを削除します。

0
gabbelduck

もう1つ:xargs rm < /path/to/file

(1行に1つのファイル名がある場合に機能します)

0
João Neto