フォローアップ
仕事:
*AlbumArt*
inameファイルを含み、inameも含むすべてのフォルダを一覧表示し、*cover*.jpg
各フォルダのサイズとともにすべてのjpgファイルを一覧表示します。find . -type f -iname '*AlbumArt*' -print0 | sort -z \ | xargs -0 -I "{}" bash -c ' find "$(dirname "${1}")" -maxdepth 1 -iname "*cover*.jpg" -print0' _ "{}" \; \ | uniq -z | xargs -0 -I "{}" bash -c ' ls -la "$(dirname "${1}")"/*.jpg;' _ "{}" \;
私は何をしたいと思うか。
*cover*.jpg
inameとinameを含むすべてのフォルダを一覧表示し、*AlbumArt*
そのフォルダ内の各画像ファイルのサイズを一覧表示し、ノーチラスを開き、それらのフォルダでこれらの画像を手動で確認できるようにしたいと思います(いくつかの追加ファイルを削除したいので)。一度に1つのフォルダを処理します。そのため、xargsのすべての出力に対してls -la
ノーチラスをオンにし、ノーチラスが閉じるのを待ちたいので、nautilus "${1}"; read -r -p "Press any key to continue" Continue;
上に追加しました。
find . -type f -iname '*AlbumArt*' -print0 | sort -z \
| xargs -0 -I "{}" bash -c '
find "$(dirname "${1}")" -maxdepth 1 -iname "*cover*.jpg" -print0' _ "{}" \; \
| uniq -z | xargs -0 -I "{}" bash -c '
ls -la "$(dirname "${1}")"/*.jpg; nautilus "${1}"; read -r -p "Press any key to continue" Continue;' _ "{}" \;
これは機能しますが、ユーザー入力のために停止しません。つまり、いくつかのread -r -p "Press any key to continue" Continue;
ノーチラスウィンドウが開きます!しかし、一度に1つのノーチラスだけを開きたいので、xargsは各行の実行後に待機したいと思います。
xargsが各行を実行した後にユーザー入力を待機させるにはどうすればよいですか?
答え1
コマンドはread
呼び出しシェルにあるため、xargs
標準入力は/dev/null
(ほとんどのxargs実装の場合)または読み取りパイプですxargs
。端末から読むには標準入力をリダイレクトしてくださいread … </dev/tty
。
まだあなたのコードを確認していません。複雑に見えます。すべてのディレクトリを繰り返す方が簡単で、おそらく目立つように遅くはないでしょう。
shopt -s globstar nullglob nocaseglob
# Caveat: this matches symbolic links to directories. And in
# versions of bash prior to 5.0 traverses (some of) those symlinks.
for d in **/*/; do
a=( "$d"/*albumart* )
c=( "$d"/*cover*.jpg )
if (( ${#a[@]} > 0 && ${#c[@]} > 0} )); then
ls -ld -- "$d"/*.jpg
nautilus -- "${c[@]}"
read -r -p "Press <Return> to continue" Continue
fi
done