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")
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 {} \;
ビットを追加する前に、必要なファイルのみが検索されていることを確認してください。
環境変数である$ 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
を使用して、使用しているコマンドを見つけるために変更しないでください。