誤ってディレクトリのフォルダをMusic
親michal
ディレクトリにコピーしました。このディレクトリを一度に削除したいです。
以下を行う方法はありますか?それとも、より良いオプションがありますか?
/home/michal/Music $ find . -type d -maxdepth 1 -exec rm -r ../{} \;
{}
上記の返却後に交換されていないようです。
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
...
答え1
あなたのfind
コマンドはGNUでうまく機能しますfind
。システムで機能しない場合は、以下を試してください。
find . -maxdepth 1 -type d -exec sh -c 'rm -r "../$1"' Rm {} \;
{}
このメソッドは、変更なしでスタンドアロンパラメータとして使用されます../
。私たちは値を{}
シェルに渡し、シェルはそれを適用します../
。
メモ:
-maxdepth 1
位置オプション(例)の前にグローバルオプション(例:)を定義することをお勧めします。これは-type d
逆の順序です。man find
-maxdepth
-type
シェルコマンドは一重引用符()で囲む必要があります
'rm -r "../$1"'
。二重引用符で囲まれた場合、元のシェルはその値を上書きし、見つかった$1
ディレクトリ名はfind
無視されます。sh
私たちに代わる召された人々が必要です。トークン化とパス名拡張からディレクトリ"../$1"
名を保護するために、文字列は二重引用符で囲まれています。$1
シェルは文字列
Rm
をに割り当てます$0
。エラーメッセージが表示されない限り、このオプションは使用されません。したがって、どの文字列でも使用できます。
答え2
そしてzsh
:
cd /home/michal &&
rm -rf -- Music/*(/D:t)
glob修飾子は隠しディレクトリを含む/
ディレクトリのみを選択しますが、履歴拡張の修飾子はディレクトリのみを選択します。D
:t
尾(ディレクトリ部分のないファイル名)。
Bourneに似たシェルの場合:
cd /home/michal/Music &&
set -- */ &&
cd .. &&
rm -rf -- "$@"
ただし、上記と1つの違いは、ディレクトリへのシンボリックリンクも含めることです(そしてリンク自体ではなくターゲットの内容を削除します)。