다음은 내 디렉토리 트리의 일부입니다.
|-- 20070214_014700.a
| |-- info
| |-- processed
| |-- HH.EL..BHZ
| |-- AZ.AS..HHZ
| |-- (hundreds more)
| |-- raw
| |-- resp
|-- 20100737_055560.a
| |-- info
| |-- processed
| |-- raw
| |-- resp
|-- 20190537_028750.a
| |-- info
| |-- processed
| |-- raw
| |-- resp
나는 약 13,000개의 디렉터리(.a로 끝남)를 갖고 있으며, 각 디렉터리에는 처리된 각 디렉터리에서 단일 디렉터리로 복사하려는 파일이 포함된 "처리된" 하위 디렉터리가 있습니다. 이러한 파일 중 일부는 동일한 파일 이름을 가질 수 있으므로 상위 디렉터리를 기반으로 이름을 바꾸고 싶습니다. 나는 너무 까다롭지는 않지만 다음과 같습니다.
20070214_014700_HH.EL..BHZ
전체 데이터 세트는 3TB이므로 Find를 사용하여 몇 개의 디렉터리에서 테스트했습니다.
find . -name processed -exec cp -r '{}' 'test/{}' \;
어떤 이유로든 이는 일부 파일을 test/에 덤프하지만 그 안에 또 다른 처리된/ 디렉터리도 생성합니다. 복사 명령과 이름 바꾸기 기능을 모두 find에 포함하는 방법을 잘 모르겠으므로 어떤 제안이라도 좋을 것입니다. 도움을 주셔서 감사합니다.
답변1
find . -type f -path "./*.a/processed/*" -exec sh -c '
for path; do
prefix=${path%%.a/processed*}
cp "$path" "test/${prefix##*/}_${path##*processed/}"
done
' sh {} +
옵션은 -type f
주어진 경로에서 일반 파일을 검색하고, 이 옵션은 결과를 인수( )로 사용 -exec
하여 쉘 스크립트를 시작합니다 . 루프 내에서 각 인수는 변수에 할당됩니다.find
{} +
for
path
예: 변수가 다음 path
과 같은 경우./20070214_014700.a/processed/AZ.AS..HHZ
prefix=${path%%.a/processed*}
접미사 제거->./20070214_014700
${prefix##*/}
/
첫 번째 -> 접두사 제거20070214_014700
${path##*processed/}
또한 접두사를 제거하고 파일 이름을 유지했습니다 ->AZ.AS..HHZ
이 명령으로 생성된 대상 파일 이름 cp
은 test/20070214_014700_AZ.AS..HHZ
.