web-dev-qa-db-ja.com

rm -rfすべてのファイルとすべての隠しファイル。 &..エラー

rm -rf /some/path/*は、そのディレクトリ(およびサブディレクトリ)の非表示ではないファイルをすべて削除します。

rm -rf /some/path/.*は、そのディレクトリのすべての隠しファイルを削除します(サブディレクトリは削除しません)。また、次のエラー/警告も表示します。

rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'

.および..に関する警告/エラーを受信せずに、ターゲットディレクトリ内のすべての非表示および非非表示のファイルとフォルダーを再帰的に削除する適切な方法は何ですか?

90
Jake Wilson

エラーメッセージはいつでも/dev/nullに送信できます

rm -rf /some/path/.* 2> /dev/null

あなたも

rm -rf /some/path/
mkdir /some/path/

...そもそも隠しファイルを気にする必要はありません。

41
evilsoup

*はすべての非ドットファイルに一致し、.[!.]*.を除くすべてのドットファイルと..で始まるファイルに一致し、..?*はすべてのドットファイルに一致します- ..を除くドットファイル。これらは一緒に、...以外のすべてのファイルに一致します。これら3つのパターンのいずれも一致しない場合、それ自体に拡張されます。 rm -fは、存在しない引数を考慮しないため、これは問題ではありません。

rm -rf ..?* .[!.]* *

findを使用することもできます。これはより複雑ですが、ファイルが多すぎて上記のワイルドカードがシステムのコマンドラインの長さの制限を超えて拡張される場合でも機能するという利点があります。

find . -name . -o -Prune -exec rm -rf -- {} +

ディレクトリを削除して再作成する方がわかりやすいかもしれません。これには、別のプログラムが同時に元のディレクトリにファイルを作成している場合でも、空のディレクトリが作成されるという利点(または場合によってはマイナス面)があります。

これがほとんどのLinuxディストリビューションで最も便利な方法であることに気づきました:

ls -A1 | xargs rm -rf

どこ

-A =すべてを一覧表示除く.および..

-1 =すべてのアイテムを1行に入れる

22
godzillante

シェルのdotglobオプションを変更して*を使用するか、findのようなものを使用します。

find somedir -mindepth 1 -delete

これは@Gillesの回答と同じように機能しますが、よりコンパクトになります。

rm -rf {,.[!.],..?}*

または

rm -rf dir/to/files/{,.[!.],..?}*

安全のために、スクリプトで使用するためにifも追加する必要があります。

if [ -d "$DIR" ]; then
    rm -rf ${DIR}/{,.[!.],..?}*
fi
5
Paweł Prażak

に関する警告/エラーを受信せずに、ターゲットディレクトリ内のすべての非表示および非非表示のファイルとフォルダを再帰的に削除する適切な方法は何ですか。そして..?

問題のディレクトリが./dirであるとすると、

rm -rf ./dir

隠しファイルと隠しディレクトリを含む./dir内のすべてのファイルを再帰的に削除し、./dirディレクトリ自体も削除します。

ディレクトリ自体を削除したくない場合は、後で再作成するか、または

find ./dir -mindepth 1 -delete

または、find-deleteをサポートしていない場合、

find ./dir -mindepth 1 -depth -exec rm -rf {} ';'

-mindepth 1を使用すると、トップレベルのディレクトリ./dirを保持できます。

3
Kusalananda

あなたの友達です。

find ! -name '.' ! -name '..' -delete

% find ! -name '.' ! -name '..'
./test
./test4
./test4/.test6
./test3
./.test5
./test2
% find ! -name '.' ! -name '..' -delete    
% find ! -name '.' ! -name '..'     
%             

現在のディレクトリ($ PWD)以外のものを再帰的に検索する場合は、findコマンドの直後にパスを追加します。例:find /path ! -name '.' ! -name '..' -deleten個のディレクトリのみを降りたい場合は、-maxdepth nパラメータの直後に/pathオプションを使用します。

上記のコマンドは、Ubuntu 13.04システムでテストされました。他の最新のLinuxシステムで動作する可能性があります。

3
laebshade

試してみることをお勧めします

ターン-[〜#〜]オン[〜#〜]dots(隠しファイル)

  • セットdotglob

    shopt -s dotglob

ターン-[〜#〜]オフ[〜#〜]dots

  • 未設定dotglob

    shopt -u dotglob

この方法は、Iwishedcopyコマンドに対して、隠しディレクトリ。

    shopt -s    dotglob
    cp    -rvn  ./$from/*  ./$too/
    shopt -u    dotglob

だから私は削除(削除)をしました、そしてoops...

    shopt -s    dotglob
    rm -fr ../message_splitter--044a/*
    shopt -u    dotglob

...それも機能します!

you親愛なる読者がmessage_splitterディレクトリを見ることができないのが私には思い当たります。どのような方法でも、削除してコピーする必要がある.svnフォルダがあります。

manページから...

dotglob設定されている場合、bashには「。」で始まるファイル名が含まれます。パス名展開の結果。

参照:

2
will

あなたが試すことができます

rm -rf /some/path/*.*
0
Saroj