프롬프트, 루프 명령

프롬프트, 루프 명령

유닉스 명령을 실행하고 파일 목록에 대해 반복하는 일반적인 방법이 있습니까? 예를 들어, 한 디렉터리에 있는 모든 파일(디렉터리 제외)을 다른 디렉터리로 이동하고 각 파일 앞에 y/n 프롬프트를 표시한다고 가정해 보겠습니다. 분명히 이것은 스크립트를 통해 수행될 수 있지만 mv뿐만 아니라 파일에 대한 유사한 작업(rm, cat, wc, grep 등)에도 사용할 수 있는 명령 방법이 있습니까?

답변1

예,

find /path/to/source/dir -type f -maxdepth 1 -ok mv {} /path/to/target/dir \;

여기의 명령은 find모든 일반 파일을 찾아 /path/to/source/dir사용자에게 주어진 작업을 수행하도록 확인하라는 메시지를 표시합니다. 이 경우 파일을 로 이동합니다 /path/to/target/dir. 사용자가 y( 및 enter)를 누르면 작업이 수행됩니다.

{}은 차례로 발견된 각 파일의 이름으로 대체되고, 각 파일에 대해 실행된 명령 은 \;.

-ok로 바꾸면 -exec사용자에게 메시지가 표시되지 않고 다음 메시지가 표시됩니다.모두문서.

-maxdepth 1파일 검색을 최상위 디렉터리( /path/to/source/dir)로 제한합니다. 이것이 없으면 find주어진 경로 아래의 모든 하위 디렉터리로 재귀됩니다.

-type f검색을 일반 파일로만 제한합니다(예: 디렉터리, 소켓, 장치 파일 등은 검색하지 않음).

답변2

일반적으로 쉘 글로빙을 사용하여 작업하려는 파일 목록을 생성한 다음 읽기 및 테스트를 수행하여 작업을 수행할지 여부를 결정합니다.

(귀하의) 예를 들어:

for f in *
do 
  [ -f "$f" ] || continue
  read -p "mv $f to /tmp? "
  if [ $REPLY = "y" ]
  then 
    echo "moving $f to /tmp"
    # mv -- "$f" /tmp
  else 
    echo "not doing anything with $f"
  fi
done

쉘 설정에 따라 도트 파일(예: )을 선택할 수도 있고 선택하지 않을 수도 있습니다 .bashrc.

원하는 대로 변경할 수 있습니다. "아니요"로 응답하지 마세요. "y", "y", "yes" 또는 "yabadabadoo"를 허용하세요.

관련 정보