예를 들어 다음 파일이 있습니다.
file0.txt
file1.txt
file2.txt
....
file100.txt
Bash에서 5개의 파일을 복사하고 싶습니다. 결과는 다음과 같습니다.
file0.txt
file19.txt
file39.txt
file59.txt
file79.txt
편집하다. 엉망인 개수는 다음과 같아야 합니다.
file0.txt
file20.txt
file40.txt
file60.txt
file80.txt
따라서 파일은 일정한 간격으로 샘플링됩니다. 멋진 oneliner가 있기를 바랍니다.
답변1
중괄호 확장은 와일드카드가 아니며 결과의 단어가 실제 파일을 참조하는지 여부에 관계없이 확장됩니다. 실제로 존재하는 파일만 복사하려면 다음을 수행하십시오.
shopt -s failglob extglob
cp file@(0|[1357]9).txt /path/to/destination/
에서는 zsh
한정자를 추가하여(nullglob의 경우) 임의 문자열의 와일드카드 해석을 강제할 수 있습니다.(N)
cp file{0,{1..79..20}}.txt(N) /path/to/destination/
오류를 방지하려면 nullglob이 필요합니다.어느전역 확장은 어떤 것과도 일치할 수 없습니다. 그러나 이는 일치하는 것이 없으면 cp /path/to/destination/
실행된다는 의미입니다. 따라서 엄밀히 말하면 다음과 같아야 합니다.
(){ if (($#)) cp $@ /path/to/destination; } file{0,{19..79..20}}.txt(N)
또는 다음을 사용하여 (0|19|...)
동적으로 글로브를 구성합니다 .
() { cp file(${(~j[|])@}).txt /path/to/destination; } 0 {19..79..20}
이번에는 nullglob이 없으므로 올바른 결과를 얻을 수 있습니다.불일치파일을 찾을 수 없으면 오류가 발생합니다.
20~5개의 숫자로 정렬된 목록을 모두 복사하려면 다음을 수행하세요 file<digits>.txt
.
() {
printf -v argv '%s%20$.0s' $argv
cp -- $argv[1,5] /path/to/destination
} file<->.txt(n)
답변2
Bash의 중괄호 확장은 다음 형식의 단계를 지원합니다 {<start>..<end>..<step>}
.
$ echo file{0..100..19}.txt
file0.txt file19.txt file38.txt file57.txt file76.txt file95.txt
불규칙한 간격이 필요한 것처럼 보이지만:
$ echo file0.txt file{19..100..20}.txt
file0.txt file19.txt file39.txt file59.txt file79.txt file99.txt
답변3
제공한 파일 이름(숫자) 집합에는 유용한 패턴이 없으므로 기대할 수 있는 가장 간단한 "한 줄"은 다음과 같습니다.
cp file0.txt file19.txt file39.txt file59.txt file79.txt destination_dir/
간격 0..100을 5로 나누거나 각 증분에 대해 20을 추가하는 것을 고려했지만 둘 다 귀하가 지정한 파일 세트를 제공하지 않았습니다.
어떤 파일 세트를 원하는지 확실하지 않은 경우 101개 파일 전체 세트를 가져와 원하는 파일 수로 나눈 다음 세트를 늘려 대상 파일을 선택할 수 있습니다. 예는 다음과 같습니다 bash
.
files=(*) # Assume current directory
samples=5 # How many required
total=${#files[@]}; echo total=$total # Number of files
interval=$(( total/samples )); echo interval=$interval # Integer arithmetic
for ((i=0; i<samples; i++))
do
fileNo=$((i*interval)) # Which sample
echo i=$i, fileNo=$fileNo, file=${files[$fileNo]} # Chosen sample
## cp -- "${files[$fileNo]}" destination_dir/ # Copy the file
done
산출
total=101
interval=20
i=0, fileNo=0, file=file0.txt
i=1, fileNo=20, file=file26.txt
i=2, fileNo=40, file=file44.txt
i=3, fileNo=60, file=file62.txt
i=4, fileNo=80, file=file80.txt
보시다시피 선택한 파일이 원하는 세트( file0.txt
, file26.txt
, 및 ) file44.txt
와 일치하지 않습니다 .file64,txt
file80.txt
답변4
시스템에 설치하면 jot
다음을 수행할 수 있습니다.
$ jot -w 'cp "file%d.txt" "destination/"' 5 0 100
이 명령은 과(포함) 사이의 숫자 jot
생성을 지시합니다. 5
각 숫자는 사양을 인쇄하는 부분에서 대체되므로 예를 들어 앞에 0이 필요한 경우 다음을 사용할 수 있습니다.0
100
%d
-w
... -w 'cp "file%03d.txt" ...
이 명령을 확인하고 원하는 대로 표시되면 화살표를 위로 올려 에 파이프하십시오 sh
.
$ jot -w 'cp "file%d.txt" "destination/"' 5 0 100
cp "file0.txt" "destination/"
cp "file25.txt" "destination/"
cp "file50.txt" "destination/"
cp "file75.txt" "destination/"
cp "file100.txt" "destination/"
$ jot -w 'cp "file%d.txt" "destination/"' 5 0 100 | sh