여러 특정 상위 디렉터리에서 파일 복사

여러 특정 상위 디렉터리에서 파일 복사

여러 하위 디렉터리로 나누어진 현재 디렉터리에서 파일을 복사하고 싶습니다. 복사하려는 파일에는 TrueFalse상위 파일만 있어야 합니다. 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~

관련 정보