Dir1, Dir2, Dir3, Dir4, Dir5라는 5개의 디렉터리가 있습니다. 각 디렉터리에는 데이터가 포함된 5개의 텍스트 파일(file1.txt, file2.tx, .file5.txt라는 이름)이 있습니다. 내가 원하는 것은 5개 디렉터리 모두에서 file1.txt를 복사하여 다른 디렉터리(Joint_Dir이라는 이름)에 순차적으로 추가하는 것입니다. file2.txt, file3.txt...file5.txt에 대해서도 동일한 작업을 수행합니다.
답변1
당신은 이것을 할 수 있습니다와일드카드 패턴/와일드카드. 예를 들어 다음 명령은 file1.txt
디렉터리의 모든 파일을 단일 파일로 연결 합니다 Joint_Dir
.
cat Dir[1-5]/file1.txt > Joint_Dir/file1.txt
하지만 패턴 일치를 사용하여 이와 같은 명령을 실행하기 전에 몇 가지 온전성 검사 명령을 실행하여 어떤 파일이 영향을 받는지 확인합니다. 이 경우 다음을 사용하여 패턴이 Dir[1-5]/file1.txt
예상 파일과 일치하는지 확인할 수 있습니다 ls
.
ls -ld Dir[1-5]/file1.txt
또 다른 옵션은 다음을 사용하는 것입니다.버팀대 확장. 중괄호 확장을 사용하여 이전 예제를 다시 작성하면 다음과 같은 결과가 생성됩니다.
cat Dir{1..5}/file1.txt > Joint_Dir/file1.txt
버팀대 확장은 소위 말하는 것입니다.바시즘그리고 다른 쉘에서는 작동하지 않을 수도 있습니다. 이 구별은 다른 곳에서 논의되었습니다.중괄호 확장이 스크립트에서 작동하지 않습니다. 기사에서 설명한 대로 다른 대안에는 seq
명령을 사용하거나 while 루프 내에서 변수를 증가시키는 것이 포함됩니다.
루프에 관해 말하자면, 단일 명령으로 모든 연결을 수행하려면 for 루프를 사용할 수 있습니다. 예를 들면 다음과 같습니다.
for i in $(seq 1 5); do
cat Dir[1-5]/file${i}.txt > Joint_Dir/file${i}.txt
done
다음은 위 기술을 사용하는 방법에 대한 독립 실행형 예입니다. 다음 명령을 있는 그대로 실행할 수 있어야 합니다. 먼저, 원래 질문에 설명된 내용을 미러링하여 테스트 파일이 포함된 디렉터리를 설정하는 스크립트는 다음과 같습니다.
#!/bin/bash
# create-test-files.sh
# Create test files and directories
for i in $(seq 1 5); do
mkdir -p "/tmp/test/Dir${i}"
for j in $(seq 1 5); do
echo "File ${j} in directory ${i}" > "/tmp/test/Dir${i}/file${j}.txt"
done
done
이 스크립트를 실행한 후 방금 생성한 내용을 검사할 수 있습니다.
$ bash create-test-files.sh
$ tree /tmp/test/
/tmp/test/
|-- Dir1
| |-- file1.txt
| |-- file2.txt
| |-- file3.txt
| |-- file4.txt
| `-- file5.txt
|-- Dir2
| |-- file1.txt
| |-- file2.txt
| |-- file3.txt
| |-- file4.txt
| `-- file5.txt
|-- Dir3
| |-- file1.txt
| |-- file2.txt
| |-- file3.txt
| |-- file4.txt
| `-- file5.txt
|-- Dir4
| |-- file1.txt
| |-- file2.txt
| |-- file3.txt
| |-- file4.txt
| `-- file5.txt
`-- Dir5
|-- file1.txt
|-- file2.txt
|-- file3.txt
|-- file4.txt
`-- file5.txt
5 directories, 25 files
파일 내용을 검사할 수도 있습니다.
$ cat /tmp/test/Dir[1-5]/file1.txt
File 1 in directory 1
File 1 in directory 2
File 1 in directory 3
File 1 in directory 4
File 1 in directory 5
$ cat /tmp/test/Dir1/file[1-5].txt
File 1 in directory 1
File 2 in directory 1
File 3 in directory 1
File 4 in directory 1
File 5 in directory 1
다음으로 다음 스크립트를 생성하여 파일을 연결할 수 있습니다.
#!/bin/bash
# concatenate-test-files.sh
# Create output directory
mkdir -p /tmp/test/Joint_Dir
# Concatenate identically-named files from different directories
for i in $(seq 1 5); do
cat "/tmp/test/Dir"[1-5]"/file${i}.txt" > "/tmp/test/Joint_Dir/file${i}.txt"
done
이 스크립트를 실행한 후 출력 디렉터리의 내용을 검사할 수 있습니다.
$ bash concatenate-test-files.sh
$ ls -1 /tmp/test/Joint_Dir/
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
$ cat /tmp/test/Joint_Dir/file1.txt
File 1 in directory 1
File 1 in directory 2
File 1 in directory 3
File 1 in directory 4
File 1 in directory 5
실험을 완료한 후 테스트 디렉터리를 삭제할 수 있습니다.
rm -rf /tmp/test