폴더의 4개 파일을 모두 복사하는 방법

폴더의 4개 파일을 모두 복사하는 방법

내 폴더에 00802_Bla_Aquarium_XXXXX.jpg.4위파일을 하위 폴더(예 selected/: .

00802_Bla_Aquarium_00020.jpg <= this one
00802_Bla_Aquarium_00021.jpg
00802_Bla_Aquarium_00022.jpg
00802_Bla_Aquarium_00023.jpg
00802_Bla_Aquarium_00024.jpg <= this one
00802_Bla_Aquarium_00025.jpg
00802_Bla_Aquarium_00026.jpg
00802_Bla_Aquarium_00027.jpg
00802_Bla_Aquarium_00028.jpg <= this one
00802_Bla_Aquarium_00029.jpg

어떻게 해야 하나요?

답변1

zsh를 사용하면 다음을 수행할 수 있습니다.

n=0; cp 00802_Bla_Aquarium_?????.jpg(^e:'((n++%4))':) /some/place

POSIXly, 같은 아이디어이지만 조금 더 자세히 설명합니다.

# put the file list in the positional parameters ($1, $2...).
# the files are sorted in alphanumeric order by the shell globbing
set -- 00802_Bla_Aquarium_?????.jpg

n=0
# loop through the files, increasing a counter at each iteration.
for i do
  # every 4th iteration, append the current file to the end of the list
  [ "$(($n % 4))" -eq 0 ] && set -- "$@" "$i"

  # and pop the current file from the head of the list
  shift
  n=$(($n + 1))
done

# now "$@" contains the files that have been appended.
cp -- "$@" /some/place

이러한 파일 이름에는 공백이나 와일드카드가 포함되어 있지 않으므로 다음을 수행할 수도 있습니다.

cp $(printf '%s\n' 00802_Bla_Aquarium_?????.jpg | awk 'NR%4 == 1') /some/place

답변2

Bash에서 이것은 여기서 잘 작동하는 흥미로운 가능성입니다.

cp 00802_Bla_Aquarium_*{00..99..4}.jpg selected

이것은 확실히 가장 짧고 효율적인 대답입니다. 서브쉘도 없고, 루프도 없고, 파이프도 없고, awk와드 외부 프로세스도 없고, 포크 cp(어쨌든 피할 수 없음)와 bash 브래킷 확장 및 글로브(왜냐하면 여러분이 어떻게 하는지 알고 있기 때문입니다. 많은 파일이 있으므로 완전히 제거할 수 있습니다.)

답변3

bash를 사용하면 다음을 수행할 수 있습니다.

n=0
for file in ./*.jpg; do
   test $n -eq 0 && cp "$file" selected/
   n=$((n+1))
   n=$((n%4))
done

패턴은 ./*.jpgbash 사용자가 설명한 대로 알파벳순으로 정렬된 파일 이름 목록으로 대체되므로 목적에 적합해야 합니다.

답변4

파일 이름에 개행 문자가 없다는 것을 알고 있다면 다음을 사용할 수 있습니다.

find . -maxdepth 1 -name "*.jpg" | sort | while IFS= read -r file; do
  cp "$file" selected/
  IFS= read -r; IFS= read -r; IFS= read -r
done

관련 정보