폴더 이름의 일부를 새 이름으로 사용하여 파일을 반복적으로 복사하고 이름을 바꿉니다.

폴더 이름의 일부를 새 이름으로 사용하여 파일을 반복적으로 복사하고 이름을 바꿉니다.

.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이름을 지정한 각 파일에 대해 인라인 스크립트를 사용합니다 shsh -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

관련 정보