![중간 디렉터리 변수가 있는 패턴이 있는 cp 파일](https://linux55.com/image/186177/%EC%A4%91%EA%B0%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EB%B3%80%EC%88%98%EA%B0%80%20%EC%9E%88%EB%8A%94%20%ED%8C%A8%ED%84%B4%EC%9D%B4%20%EC%9E%88%EB%8A%94%20cp%20%ED%8C%8C%EC%9D%BC.png)
나는 디렉토리 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/*.jpg
cp 또는 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/*.png
png
실행하지 않으면 bash
리디렉션할 수 있습니다.표준 에러잘못된 확장 모드(예:) 오류로 인해 생성된 오류 메시지가 표시되지 않도록 명령 출력을 cp
null( )로 설정합니다. 그러나 다른 오류 메시지도 리디렉션하므로 이것이 마지막 단계 옵션이 되어야 합니다.cp ... 2>/dev/null
10020/live/*.png
정말 깔끔한 솔루션을 원한다면 파일을 하나씩 복사할 수 있지만 이는 효율성이 떨어지고 읽기가 더 어려운 경우가 많습니다.
for file in */live/*.jpg */live/*.png
do
[ -f "$file" ] && cp "$file" dir/
done
실제로 뒤에 슬래시가 필요하지는 않지만 디렉터리로 사용하려는 dir/
의도를 분명히 하기 위해 이렇게 쓰는 경향이 있습니다 . ( 존재하지 않는 파일을 dir
복사하게 되는 극단적인 경우 대신 를 사용하면 자동으로 파일 이름을 로 바꾸는 대신 오류가 발생하고 안전하게 실패하게 됩니다 .)dir
dir/
dir
dir
두 경우 모두 실제로 명령을 변경하지 않고 실행될 내용을 확인하기 위해 명령 echo
앞에 접두사를 사용할 수 있습니다 .cp
echo cp …
cp …