ext が見つかったら親ディレクトリを検索し、見つからない場合は echo します

ext が見つかったら親ディレクトリを検索し、見つからない場合は echo します

これまでのところ、私はこれを思いつきました。

if ls -1 ~/Downloads/*.mkv >/dev/null 2>&1
then
        echo 1
else
        echo 0
fi

しかし、私がやりたいのは、見つかったファイルの親ディレクトリを別の場所にコピーすることです。

find コマンドを使用するだけでよいような気がします。

答え1

findfede.evolの回答は、パスに空白が含まれていると失敗します。またはの出力はls コマンド置換では使用しないでください

すべてのファイル名(改行を含むパスを除く)を処理する適切な方法は次のとおりです。

find /somewhere -name "*.mkv" -exec dirname {} \; | uniq | \
while IFS= read -r dir; do echo cp -- "$dir" /other/; done

この方法では、 の各フォルダー/somewhereが にコピーされます/other/。末尾のスラッシュは必須であることに注意してください。そうしないと、ターゲットが常に上書きされます。

答え2

指定されたファイルのディレクトリ名を取得するために使用しますdirname FILE。たとえば、次のようになります。

find DIRECTORY -name "*.mkv" -exec dirname {} \;

DIRECTORY の下に MKV があるすべてのディレクトリが表示されます。uniq重複しないようにそれらを通過させてから、コピーすることができます。

例えば

cp -a `find DIRECTORY -name "*.mkv" -exec dirname {} \; | uniq` DESTDIR

関連情報