여러 하위 디렉터리로 나누어진 현재 디렉터리에서 파일을 복사하고 싶습니다. 복사하려는 파일에는 True
및 False
상위 파일만 있어야 합니다. True
카탈로그 파일은 에 복사되어야 하며 dst/report/1/
카탈로그 False
파일은 에 위치해야 합니다 dst/report/2/
.
복사 프로세스를 자동화하는 방법을 아직 모르겠습니다.
써먹을 수 있을 줄 알았는데
find . -maxdepth digit
깊이가 정확히 어느 정도인지는 모르겠습니다.파일은 그냥
*.txt
파일이어야 합니다. 일부 이름이 중복되더라도 내용이 다르기 때문에 대상 폴더에 있는 파일 중 하나를 사용하되cp
덮어써야 합니다.True
중간 상위 디렉터리 가False
존재할 수 있지만 내가 원하는 파일은 마지막 상위 디렉터리에 생성됩니다.또한, 디렉토리 공간이 약 2개 정도이므로
200GiB
검색하는데 시간이 좀 걸립니다.디렉터리와 파일의 이스케이프 문자에 대해 잘 모르기 때문에 복사 프로세스를 방해하고 싶지 않습니다.
샘플 작업공간:
```
__ current dir
|__ path_1
|__ True
|__ 00000.txt
|__ 020.txt
|__ p_x
|__ 100
|__ True
|__ 00000.txt
|__ 020.txt
|__ 10.txt
|__ False
|__ 1.txt
|__ 2.txt
|__ 200.txt
|__ x
|__ True
|__ 00000.txt
|__ 020.txt
|__ False
|__ 1.txt
|__ 2.txt
|__ True
|__ path_2
|__ True
|__ 1.txt
|__ x_p
|__ ...
|__ ...
.
.
.
예상 결과:
__ dst
|__ report
|__ 1
|__ 00000.txt
|__ 020.txt
|__ 00000_1.txt
|__ 020_1.txt
|__ 10.txt
|__ 1.txt
|__ 2
|__ 1.txt
|__ 2.txt
|__ 200.txt
|__ 1_1.txt
|__ 2_2.txt
고쳐 쓰다
@muru가 답변했듯이 cp는 작을 수 있지만 bash()를 통해 처리할 수 있는 인수 수에는 제한이 있습니다 getconf ARG_MAX
.
shopt -s globstar
cp --backup=numbered **/True/*.txt dst/report/1/
cp --backup=numbered **/False/*.txt dst/report/2/
그래서 그 당시 이러한 명령을 실행한 후 -bash: /bin/cp: Argument list too long
보상을 받았습니다.
@muru가 주석에서 다시 언급했듯이 xargs
이 문제는 (GNU xargs 및 cp를 가정하여) 해결될 수 있습니다.
printf "%s\0" **/True/*.txt | xargs -0 cp --backup=numbered -t dst/report/1/
숫자 확장자를 가진 중복 파일이 있는 경우 rename
유용합니다 (예: bar.txt.~1~ 등).
prename 's/(.txt).~(\d+)~$/-$2$1/' dst/report/*/*,
답변1
Bash를 사용하여 재귀 glob을 활성화한 **
다음 및 패턴을 shopt -s globstar
사용하고 , GNU cp가 있는 경우 파일 덮어쓰기를 방지하려면 또는 옵션을 사용하세요.**/True/*.txt
**/False/*.txt
--backups
-b
shopt -s globstar
cp --backup=numbered **/True/*.txt dst/report/1/
cp --backup=numbered **/False/*.txt dst/report/2/
번호 가 cp
추가됩니다.뒤쪽에확장자 이름:
% touch foo.txt
% cp foo.txt bar.txt
% cp --backup=numbered foo.txt bar.txt
% ls bar.txt*
bar.txt bar.txt.~1~
% cp --backup=numbered foo.txt bar.txt
% ls bar.txt*
bar.txt bar.txt.~1~ bar.txt.~2~