찾기 - xargs, 각 줄에 대해 새 쉘을 열고 명령을 실행하고 사용자가 쉘을 종료할 때까지 기다립니다.

찾기 - xargs, 각 줄에 대해 새 쉘을 열고 명령을 실행하고 사용자가 쉘을 종료할 때까지 기다립니다.

후속작

  • : *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*.jpginame 및 iname을 포함하는 모든 폴더를 나열 *AlbumArt*하고 해당 폴더에 있는 각 이미지 파일의 크기를 나열하고 노틸러스를 열어 해당 폴더에서 이러한 이미지를 수동으로 확인할 수 있도록 하고 싶습니다(일부 추가 파일을 제거하고 싶기 때문에). 한 번에 하나의 폴더를 처리합니다. 따라서 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;여러 노틸러스 창이 열립니다! 하지만 한 번에 하나의 노틸러스만 열고 싶기 때문에 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

관련 정보