csvファイルBashスクリプトを除くすべてのエントリを削除する

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")

答え1

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

BASHの場合外部グローバル変数シェルオプションを有効にすると(多くのLinuxディストリビューションのデフォルト値)、次のようになります。

rm !(*.csv)

フォルダパスを使用すると、次のようになります。

rm yourfolder/!(*.csv)

あなたの環境でextglobが有効になっていないと思われる場合は、次のようにします。

shopt -s extglob

答え2

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

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 {} \;

答え3

/tmp興味のあるファイルだけをコピーし、残りのファイルを削除しないことをお勧めします。

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

でも

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

保管する必要がない場合/tmp

これは、関心のあるすべてのファイルが直接場所にあると仮定します/tmprm

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

関連情報