多数のファイルを含むディレクトリがあります。file.txtを除くすべてのファイルを削除します。どうすればいいですか?
不要なファイルを個別に削除するにはファイルが多すぎるため、その名前は多様であるため、*を使用してこの1つのファイル以外のすべてを削除することはできません。
誰かが使用することを提案しました
rm !(file.txt)
しかし、それは機能しません。戻ります:
Badly placed ()'s
私のOSはScientific Linux 6です。
何か案は?
多数のファイルを含むディレクトリがあります。file.txtを除くすべてのファイルを削除します。どうすればいいですか?
不要なファイルを個別に削除するにはファイルが多すぎるため、その名前は多様であるため、*を使用してこの1つのファイル以外のすべてを削除することはできません。
誰かが使用することを提案しました
rm !(file.txt)
しかし、それは機能しません。戻ります:
Badly placed ()'s
私のOSはScientific Linux 6です。
何か案は?
回答:
POSIXly:
find . ! -name 'file.txt' -type f -exec rm -f {} +
を除くすべての通常のファイル(再帰的に、隠しファイルを含む)を削除しますfile.txt。ディレクトリを削除するには、に変更-type fし-type d、-rオプションを追加しますrm。
でbash使用するには、rm -- !(file.txt)あなたがしなければならないextglobを有効にします:
$ shopt -s extglob
$ rm -- !(file.txt)
(または呼び出しbash -O extglob)
Kornシェルファミリでextglobのみ機能することに注意してくださいbash。また、使用rm -- !(file.txt)するとArgument list too longエラーが発生する可能性があります。
ではzsh、extendedglobを有効にして^パターンを無効にするために使用できます。
$ setopt extendedglob
$ rm -- ^file.txt
またはと同じ構文を使用kshし、bashオプションでksh_globかつno_bare_glob_qual有効。
rm、echo rm代わりにasを使用して任意の例を記述し、人々が本当に望んでいることを行うことが確実な場合にのみエコーを取り出すように依頼します。それ以外は、徹底的な回答のために+1
-delete代わりに-exec、より短く、覚えやすいことをお勧めします
-deletePOSIXでは定義されていません。
findソリューションを使用できます! \( -name one_file -o -name two_file \)。
別の方向をとる(ファイル名にスペースがない場合)
ls | grep -v file.txt | xargs rm
または(ファイル名にスペースが含まれていても機能します)
ls | grep -v file.txt | parallel rm
からman grep:
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX)
ls | grep -v "a file with spaces.bin" | xargs rm。これは通常のgrep構文です。
grepけどrm。rmスペースで区切られた引数のリストを取得します。試してみてくださいtouch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm:あなたが得るだろうrm: c: No such file or directoryとrm: d: No such file or directory
-print0中findと-0ではxargs。これは回避策ですが、少し不便です。find . -maxdepth 1 -type f | grep -v 'a b' | tr '\n' '\0' | xargs -0 rm。ちなみに、gnu parallelはこれをうまく処理します(ほとんどの場合、xargsの代わりとして使用します。– ls | grep -v 'a b' | parallel rm
-。
コピーを維持し、すべてを削除し、コピーを復元します。
{ rm -rf *
tar -x
} <<TAR
$(tar -c $one_file)
TAR
1行で:
{ rm -rf *; tar -x; } <<< $(tar -c $one_file)
しかし、それにはhere-stringsをサポートするシェルが必要です。
rmとtar -x。rm必要なだけ失敗する可能性があります。
あなたはすべてこれを考え直しています。
cd ..
mv fulldir/file.txt /tmp/
rm -rf fulldir
mkdir fulldir
mv /tmp/file.txt fulldir/
できた
編集実際、もっと簡単:
cd ..
ln fulldir/file.txt ./
rm -rf fulldir
mkdir -p fulldir
mv file.txt fulldir/
Scientific Linux 6 OSでは、これは機能します。
shopt -s extglob
rm !(file.txt)
また、仮想マシンにDebian 32ビットをインストールしています。上記は機能しませんが、以下は機能します。
find . -type f ! -name 'file.txt' -delete
find私が提供した解決策が機能しなかったということですか?
file.txtか、他の何か?
shoptはありませんtcsh。