web-dev-qa-db-ja.com

csvファイル以外のすべてを削除するBashスクリプト

Csvファイル以外のすべてをフォルダーから削除したい

私はbashスクリプトで試していますが、このエラーが発生します:

syntax error near unexpected token `('

これは私のスクリプトです:

 PATH=/tmp/

 run_spark_local
 rm -v !($PATH*.csv)

 cp -r $PATH /data/logs/

私も試しました

rm -v !("$PATH*.csv")
3
MobZSPARK

PATH変数の設定は避けてください。これは、シェルが有効なコマンドを見つけるために使用され、/tmp/に設定すると、スクリプトがrmおよびcpコマンドを完全に見つけられなくなります。

次のfindコマンドを使用して、必要なことを実行できます。

find /tmp -not -name '*.csv' -not -path /tmp -exec rm -vr {} \;

注:これにより、/ tmpの下のサブディレクトリもすべて削除されます。これを望まない場合は、次のように変更する必要があります。

find /tmp -not -name '*.csv' -type f -exec rm -v {} \;

別のメモ:これは依然としてサブディレクトリに再帰し、その中のファイルを削除します。これが必要ない場合は、maxdepth引数を使用できます。

find /tmp -not -name '*.csv' -maxdepth 1 -type f -exec rm -v {} \;

補足:オンラインで見つけたfind ... -execコマンドは、最初に必要なことを実行することを確認せずに実行することはありません。あなたは実行する必要があります:

find /tmp -not -name '*.csv' -not -path /tmp

また、-exec rm -vr {} \;ビットを追加する前に、必要なファイルのみが検索されていることを確認してください。

4
jesse_b

環境変数である$ PATHを設定しないでください。

BASHの場合、 extglob シェルオプションが有効になっている限り(多くのLinuxディストリビューションのデフォルトです)、次のようになります。

rm !(*.csv)

フォルダパスを指定すると、次のようになります...

rm yourfolder/!(*.csv)

環境でextglobが有効になっていないと思われる場合は、次のようにしてください。

shopt -s extglob

/tmpのその他すべてを削除するのではなく、関心のあるファイルのみをコピーすることをお勧めします。

cp /tmp/*.csv /data/logs/

あるいは

mv /tmp/*.csv /data/logs/

それらを/tmpに保持する必要がない場合。

これは、関心のあるすべてのファイルが直接/tmpにあることを前提としています。 rmの使用は、そうであることを示唆しています。

/tmpは共有の一時ディレクトリであるため、他の実行中のプロセスがそこにあると予期する他のファイルが含まれている可能性があり、CSVファイル以外の/tmpのすべてを削除すると、悪影響が生じる可能性があります。他の人が述べたように、シェルはPATHを使用して、使用しているコマンドを見つけるために変更しないでください。

4
Stephen Kitt