.csv
확장자를 가진 파일이 포함된 폴더를 반복적으로 복사하고 단일 폴더에 복사할 때 이름을 바꾸려고 합니다 .
알아낼 수 없는 파일 이름 변경을 제외하고는 거의 비슷합니다.
누구든지 도와줄 수 있나요?
find "/IMPORTS/EFHG2" -iname '*.csv*' -exec cp {} /temp/Template \;
이름 바꾸기에 관해서는 파일이 있는 상위 폴더에 대한 표시를 제공할 수 있는 항목을 찾고 있습니다.
- 원래(
file1.csv
,file2.csv
) - 수정됨(
dir1.file1.csv
,dir2.file1.csv
)
답변1
다음과 같은 구조를 가지고 있습니다:
├── destdir
└── srcdir
├── dir1
│ └── with space.csv
├── dir2
│ └── infile.csv
└── dir3
└── otherfile.Csv
실행 명령:
find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '
path="${1%/*}"; filename="${1##*/}";
echo cp -nv "${1}" "/path/to/destdir/${path##*/}.${filename}" ' sh_cp {} \;
다음과 같은 출력이 생성됩니다(건조 모드에서 실행).
cp -v /path/to/srcdir/dir2/infile.csv /path/to/destdir/dir2.infile.csv
cp -v /path/to/srcdir/dir1/with space.csv /path/to/destdir/dir1.file with space.csv
cp -v /path/to/srcdir/dir3/otherfile.Csv /path/to/destdir/dir3.otherfile.Csv
복사본을 가져오고 감정 이름을 바꾸기 위해 echo
앞의 명령을 제거하면 (모의 실행용) 다음과 같은 구조를 얻게 됩니다.cp
├── destdir
│ ├── dir1.with space.csv
│ ├── dir2.infile.csv
│ └── dir3.otherfile.Csv
└── srcdir
├── dir1
│ └── with space.csv
├── dir2
│ └── infile.csv
└── dir3
└── otherfile.Csv
참고로 하위 디렉터리에 동일한 파일명, 동일한 상위 디렉터리 이름이 존재하면 find
명령어로 찾은 최신 파일로 덮어쓰게 되므로 이를 방지하기 위해 명령어를 사용했기 -n
때문에 cp
동일한 파일은 복사되지 않습니다. , 이것에 주의해 주세요.
설명하다:
find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '...' sh_cp {} \;
.csv
접미사(대소문자 무시)가 있는 파일을 반복적으로 찾고 -exec
이름을 지정한 각 파일에 대해 인라인 스크립트를 사용합니다 sh
sh -c '...'
sh_cp
{}
.파일 경로find 명령으로 찾은 다음 이를 스크립트에 전달하고 또는 매개변수를 통해 액세스할 수 $1
있습니다 ${1}
.
${1%/*}
:매개변수에서 가장 짧은 접미사를 제거합니다${1}
(알려짐).쉘 매개변수 확장),${1}
상술 한 바와 같이파일 경로그래서 우리는 포기한다파일 이름+ 마지막/
부터파일 경로그리고 유지만길그리고path
변수에 저장됩니다.${1} --> /path/to/srcdir/dir2/infile.csv ${1%/*} --> /path/to/srcdir/dir2
${1##*/}
${1}
: 이 방법으로 매개변수에서 가장 긴 접두사를 제거합니다 .길~에서파일 경로그리고 유지만파일 이름그리고filename
변수에 저장됩니다.${1} --> /path/to/srcdir/dir2/infile.csv ${1##*/} --> infile.csv
그리고 그에 따라:
path --> /path/to/srcdir/dir2 ${path##*/} --> dir2 ${filename} --> infile.csv ${path##*/}.${filename} --> dir2.infile.csv
팁:
xYz='to-test/path/to/srcdir/dir2/infile.csv'
${xYz%/*} --> to-test/path/to/srcdir/dir2
${xYz%%/*} --> to-test
${xYz#*/} --> path/to/srcdir/dir2/infile.csv
${xYz#*/} --> infile.csv