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/
完全に見つけることができなくなります。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 {} \;
。
答え3
/tmp
興味のあるファイルだけをコピーし、残りのファイルを削除しないことをお勧めします。
cp /tmp/*.csv /data/logs/
でも
mv /tmp/*.csv /data/logs/
保管する必要がない場合/tmp
。
これは、関心のあるすべてのファイルが直接場所にあると仮定します/tmp
。rm
/tmp
共有一時ディレクトリなので、実行中の他のプロセスがそこにあると予想する他のファイルが含まれる可能性があり、/tmp
CSVファイルを除くすべてのエントリを削除すると、望ましくない結果が生じる可能性があります。他の人が述べたように、PATH
シェルはそれを使用して使用しているコマンドを見つけるため、これを変更しないでください。