10

特定のディレクトリにcdする非常に単純なBashシェルスクリプトを作成しようとしています。選択したいくつかのものを除くすべてのファイルとディレクトリを削除してから、元のディレクトリに戻ります。

私のコードは次のとおりです。

#!/bin/bash 
cd /path/to/desired/directory
shopt -s extglob
rm !\(filename1\|filename2\|filename3\) -rf
cd -

一重引用符または二重引用符またはバックスラッシュを使用して、記号「(」および「|」を記述するさまざまな方法を試しましたが、何も機能しませんでしshopt -s extglobrm !(filename1|filename2) -rf

おそらく、私は見ることができない標準的かつ基本的なbashスクリプトエラーを犯していますが、経験はこれからです...

助言がありますか!?前もって感謝します。

4

5 に答える 5

9

すぐにわかる2つの問題:

  • への-rf引数は、ファイル名のrmに来なければなりません
  • extglob 指定子!(|およびはバックスラッシュでエスケープしない)でください

代わりにこれを試してください:

rm -rf !(filename1|filename2|filename3)

それでも問題が解決しない場合は、-f引数を削除してください。そうすれば、暗黙のうちにそれらを抑制するのではなく、何が問題なのかに関するエラー メッセージが表示されます。削除された各ファイルの名前を出力するには、-vオプションを追加することもできます。

于 2013-11-05T05:33:31.497 に答える
4

の最新バージョンを使用している場合はfind、次を使用します。

find . -not -regex "filename1|filename2|filename3" -print

出力を確認し、本当に削除したいファイルのみを出力-printする場合は置き換えます。-delete

のバージョンが をfindサポートしていない場合は-delete-type f -exec rm "{}" \;

これはファイルのみを削除することに注意してください。これは重要です: ファイルを保持すると言ったxが、そのファイルがフォルダー内にある場合、フォルダー全体で後でそれを削除することだけyが無視されます。xy

すべての空のフォルダーを削除するには (これにより、保持したいファイルが保持されます):

find . -type d -empty -exec rmdir "{}" \;

(ソース: Unix で空のディレクトリとファイルを見つけて削除する方法)

于 2013-11-05T08:06:06.040 に答える
0

ファイルがあると仮定します:

drwxr-xr-x 2 ルート ルート 4096 Feb 1 02:17 a

drwxr-xr-x 2 ルート ルート 4096 Feb 1 02:17 b

drwxr-xr-x 2 ルート ルート 4096 Feb 1 02:17 c

drwxr-xr-x 2 root root 4096 Feb 1 02:17 d

drwxr-xr-x 2 root root 4096 Feb 1 02:17 e

drwxr-xr-x 2 ルート ルート 4096 Feb 1 02:17 f

drwxr-xr-x 2 root root 4096 Feb 1 02:18 nodelete1

drwxr-xr-x 2 root root 4096 Feb 1 02:18 nodelete2

あなたがすることができます:

ls | grep -v "nodel.\+" | xargs rm -rf

高度な正規表現構文を使用してファイルを除外します。

説明:

ls --- 現在のディレクトリを一覧表示します (ディレクトリのみを一覧表示するには ls -d )

grep -v --- v フラグは、一致しないものを指定します + -P フラグを指定した場合、grep で perl スタイルの正規表現を書き込むことができます

xargs --- 各アイテムにアクション「rm -rf」を適用します

于 2014-01-31T18:30:26.867 に答える
0

以下を試してください:

for i in `ls | grep -v "file1\|file2\|file3"` ; do rm -rf $i; done

幸運を!

于 2013-11-05T07:52:36.933 に答える