내 폴더에 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
패턴은 ./*.jpg
bash 사용자가 설명한 대로 알파벳순으로 정렬된 파일 이름 목록으로 대체되므로 목적에 적합해야 합니다.
답변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