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 つの違いは、ディレクトリへのシンボリック リンクも含まれることです (リンク自体ではなく、ターゲットのコンテンツが削除されます)。

関連情報