중간 디렉터리 변수가 있는 패턴이 있는 cp 파일

중간 디렉터리 변수가 있는 패턴이 있는 cp 파일

나는 디렉토리 l을 가지고있다

── 10020
│   ├── live
│   │   ├── 211231.jpg
│   │   ├── 211231_BB.txt
│   │   ├── 448378.jpg
│   │   ├── 448378_BB.txt
│   │   ├── 460830.jpg
│   │   └── 460830_BB.txt
│   └── spoof
│       ├── 035383.jpg
│       ├── 035383_BB.txt
│       ├── 057847.jpg
│       ├── 057847_BB.txt
│       ├── 080343.jpg
│       ├── 080343_BB.txt
├── 10021
│   ├── live
│   │   ├── 013031.jpg
│   │   ├── 013031_BB.txt
│   │   ├── 025895.jpg
│   │   ├── 025895_BB.txt
│   └── spoof
│       ├── 006434.jpg
│       ├── 006434_BB.txt
│       ├── 021470.jpg
│       ├── 021470_BB.txt
│       ├── 027017.jpg
│       ├── 027017_BB.txt
├── 10022
│   ├── live
│   │   ├── 125401.jpg
│   │   ├── 125401_BB.txt
│   │   ├── 196573.jpg
│   │   └── 196573_BB.txt
│   └── spoof
│       ├── 013054.jpg
│       ├── 013054_BB.txt
│       ├── 015386.jpg
│       ├── 015386_BB.txt
│       ├── 016760.jpg
│       ├── 016760_BB.txt
│       ├── 020204.jpg
│       ├── 020204_BB.txt
├── 10023
│   ├── live
│   │   ├── 000240.jpg
│   │   ├── 000240_BB.txt
│   │   ├── 030384.jpg
│   │   ├── 030384_BB.txt
│   │   ├── 034898.jpg
│   │   ├── 034898_BB.txt
│   └── spoof
│       ├── 022241.jpg
│       ├── 022241_BB.txt
│       ├── 023855.jpg
│       ├── 023855_BB.txt
│       ├── 030252.jpg
│       ├── 030252_BB.txt
│       └── 475104_BB.txt
 [it goes on, as you guys suggested I put up the real directory rather than a simplified version]

*/live/*.jpgcp 또는 mv를 모두 실행 하고 */live/*.png 다른 디렉토리로 이동하고 싶은데 dir 어떻게 해야 합니까?

내가 시도한 것들:

rsync -av ~/train/*/*.jpg dir
find ~train/ -type f -name '*/live/*.jpg' -exec cp '{}' dir ';'
rsync -a --include '*.jpg' --exclude 'live/*' ~/train/ dir

답변1

find -path '/media/data/woreom/dataset/CelebA_Spoof/Data/train /*/real/*.jpg' -type f -exec cp '{}' /media/data/woreom/dataset/dataset/real/ ';'아무것도 하지 않았습니다.

/media/data/woreom/datase…현재 작업 디렉토리를 살펴보라고 요청했기 때문입니다.

첫 번째 매개변수로 검색 위치를 지정해야 합니다. 대신에 (제 생각에는 이것이 효과가 있을 것 같습니다.)

find /media/data/woreom/dataset/CelebA_Spoof/Data/train \
    -path '/*/real/*.jpg' -type f \
    -exec echo cp '{}' /media/data/woreom/dataset/dataset/real/ ';'

테스트라는 단어를 추가 echo하고 제대로 작동하면 제거했습니다.

답변2

내가 볼 수 있듯이 이 경우에는 이름이 인 하위 디렉터리가 존재하지 않으므로 real실제 디렉터리 이름을 공유하는 경우 키워드에 문제가 있을 수 있습니다. 그런데, @Kusalananda 구조로 "find"를 사용하거나 for 루프를 사용하여 파일과 디렉터리를 cp로 만들 수 있습니다.

답변3

이를 디렉토리 구조에 맞게 조정하고 내가 올바르게 이해했다고 가정하면 이것이 작동할 것입니다.

user@user:~$ tree

├── dir
└── foo
    ├── 10021
    │   └── live
    │       ├── a.jpg
    │       ├── b.jpg
    │       ├── c.jpg
    │       └── d.jpg
    ├── 10022
    │   └── live
    │       ├── e.jpg
    │       └── f.jpg
    └── 10023
        └── live
            ├── g.jpg
            ├── h.jpg
            ├── i.jpg
            └── j.jpg

이제 홈 디렉터리에 다음을 입력하세요.

cp */live/*.{jpg,png} ~/dir/

답변4

와일드카드를 사용하여 쉘이 무거운 작업을 수행하도록 할 수 있습니다.

shopt -s nullglob
cp */live/*.jpg */live/*.png dir/

첫 번째 명령은 bash존재하지 않는 패턴 확장에 실패하지 않고 불일치로 삭제하도록 셸에 지시합니다. (예를 들어, 귀하의 질문에 따르면 디렉토리에 png파일이 없습니다 . 이는 일반적 으로 이름에 별표가 있는 파일이 없기 때문에 10020/live/명령이 일치할 수 없는 리터럴을 보게 된다는 것을 의미합니다 .)10020/live/*.pngpng

실행하지 않으면 bash리디렉션할 수 있습니다.표준 에러잘못된 확장 모드(예:) 오류로 인해 생성된 오류 메시지가 표시되지 않도록 명령 출력을 cpnull( )로 설정합니다. 그러나 다른 오류 메시지도 리디렉션하므로 이것이 마지막 단계 옵션이 되어야 합니다.cp ... 2>/dev/null10020/live/*.png

정말 깔끔한 솔루션을 원한다면 파일을 하나씩 복사할 수 있지만 이는 효율성이 떨어지고 읽기가 더 어려운 경우가 많습니다.

for file in */live/*.jpg */live/*.png
do
    [ -f "$file" ] && cp "$file" dir/
done

실제로 뒤에 슬래시가 필요하지는 않지만 디렉터리로 사용하려는 dir/의도를 분명히 하기 위해 이렇게 쓰는 경향이 있습니다 . ( 존재하지 않는 파일을 dir복사하게 되는 극단적인 경우 대신 를 사용하면 자동으로 파일 이름을 로 바꾸는 대신 오류가 발생하고 안전하게 실패하게 됩니다 .)dirdir/dirdir

두 경우 모두 실제로 명령을 변경하지 않고 실행될 내용을 확인하기 위해 명령 echo앞에 접두사를 사용할 수 있습니다 .cpecho cp …cp …

관련 정보