유닉스 명령을 실행하고 파일 목록에 대해 반복하는 일반적인 방법이 있습니까? 예를 들어, 한 디렉터리에 있는 모든 파일(디렉터리 제외)을 다른 디렉터리로 이동하고 각 파일 앞에 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"를 허용하세요.