findコマンド:パスに{}を使用する

findコマンド:パスに{}を使用する

誤ってディレクトリのフォルダをMusicmichalディレクトリにコピーしました。このディレクトリを一度に削除したいです。

以下を行う方法はありますか?それとも、より良いオプションがありますか?

/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 {} \;

{}このメソッドは、変更なしでスタンドアロンパラメータとして使用されます../。私たちは値を{}シェルに渡し、シェルはそれを適用します../

メモ:

  1. -maxdepth 1位置オプション(例)の前にグローバルオプション(例:)を定義することをお勧めします。これは-type d逆の順序です。man find-maxdepth-type

  2. シェルコマンドは一重引用符()で囲む必要があります'rm -r "../$1"'。二重引用符で囲まれた場合、元のシェルはその値を上書きし、見つかった$1ディレクトリ名はfind無視されます。sh私たちに代わる召された人々が必要です。トークン化とパス名拡張からディレクトリ"../$1"名を保護するために、文字列は二重引用符で囲まれています。$1

  3. シェルは文字列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つの違いは、ディレクトリへのシンボリックリンクも含めることです(そしてリンク自体ではなくターゲットの内容を削除します)。

関連情報