awk의 출력을 mv의 입력으로 사용

awk의 출력을 mv의 입력으로 사용

저는 더 작은 크기의 모든 이미지 파일을 찾아 디렉터리로 이동하는 스크립트(또는 한 줄짜리)를 작성하려고 합니다. 기반으로이 답변은 Ask Ubuntu에서 나왔습니다., 두 크기가 모두 500 미만인 파일 목록을 생성할 수 있었습니다.일반적인 이미지 파일도 모두 찾을 수 있습니다.jpg.

find -E . -regex ".*\.(jpg|gif|png|jpeg)" -type f -exec identify -format '%w %h %i\n' '{}' \; | awk '$1<500 && $2<500' | awk '{print $3}'

두 번째 awk는 내가 원하는 파일 이름만 인쇄한다는 것입니다 mv. 이 출력을 어떻게 에 넣을 수 있습니까 mv?


첫 번째 출력의 예는 다음 awk과 같습니다.

123 456 ./smallimage.jpg
333 333 ./square.png

두 번째는 awk방금 주어졌습니다.

./smallimage.jpg
./square.png

mv그러나 필요한 최종 명령은 다음과 같은 형식이기 때문에 이 파일 이름 목록을 명령에 대한 입력으로 가져오는 방법을 찾을 수 없는 것 같습니다.mv <file list> ./small_images/

답변1

다음 기능을 사용하여 병합 mv되었습니다 .awksystem()

awk '$1<500 && $2<500 {system("mv "$3" /destination")}

mv필요에 맞게 명령을 변경합니다 . 여기서는 다음을 사용했습니다.

mv /file_(third_field)_from_awk /destination

또한 여러 개가 필요하지 않으며 awk위에 표시된 대로 하나만 있으면 충분합니다.

답변2

파일 이름에 개행 문자가 포함되어 있지 않다고 가정하면 GNU mvxargs프로그램을 사용하여 이를 수행할 수 있습니다.

 ... | awk ... | xargs -d'\n' mv -t ./small_images

xargs는 입력에서 파일 이름을 수집하여 명령에 추가하고 mv -t ./small_images필요에 따라 매우 긴 명령을 분할합니다. 명령 시작 부분에 대상 디렉터리를 지정하거나 이를 처리하기 위한 작은 스크립트를 작성할 mv수 있는 버전이 필요합니다 .-t

관련 정보