이것이 나의 초기 상황입니다.
예를 들어, 이름이 지정된 폴더에는 Father
다음과 같은 방식으로 저장된 일부 파일이 있습니다. 24개의 하위 폴더( , , ... Father
라고 부르겠습니다 )가 포함되어 있으며, 각 하위 폴더에는 2개의 파일이 있으며, 첫 번째 하위 폴더에는 2개의 폴더와 2개의 첫 번째 하위 폴더가 있습니다 . 두 번째 등등.Child1
Child2
file1.avi
file1.nfo
file2.avi
file2.nfo
내가 하고 싶은 일은 .avi
모든 파일을 폴더에 넣는 것 입니다 Father
. 다른 파일이 누락되는 것은 신경 쓰지 않습니다.
지금까지 시도한 가장 좋은 방법은 a를 사용하는 것이지만 cp -R ./*.avi .
폴더에서 파일을 추출하지 않고 처리하는 데 시간이 오래 걸립니다.
어떻게 써야 할까요?
답변1
glob은 *
일반 파일뿐만 아니라 디렉터리도 일치시키는 데 사용할 수 있으므로 찾고 있는 명령은 다음과 같습니다.
mv ./*/*.avi .
답변2
find
이 명령의 옵션을 사용할 수 있습니다 -exec
.
cd Father
find Child1 Child2 ... -name '*.avi' -exec mv -n {} . +
명령은 다음과 같이 분류됩니다.
find Child1 Child2 ...
Child1, Child2 등 아래의 모든 파일과 디렉터리가 검색됩니다. 기본 작업은 이름을 인쇄하는 것입니다.-name '*.avi'
이름 패턴 "*.avi"와 일치하는 파일(또는 디렉터리)로 결과를 제한합니다.-exec mv {} . +
find
일치 결과를 인쇄하는 대신 명령이 실행될 것임을 나타냅니다 .{}
명령에서find
찾은 파일 이름을 어디에 넣어야 하는지를 나타내고,+
실행할 명령의 끝을 나타내며 대신 가능한 한 많은 파일 이름을 넣어야 함을 나타냅니다. 파일 이름당 한 번씩 명령을 실행합니다. 예를 들어, 다음과 같습니다.mv -n Child1/as.avi Child1/many.avi Child1/matching.avi Child1/filenames.avi Child1/as.avi Child1/possible.avi .
명령이 어떤 것인지 보고 싶다면가능한-exec echo mv
그렇게 하려면 언제든지 대신 쓸 수 있습니다 .-exec mv
참고 1:명령에 도달하기 전에 쉘에 의해 파일 이름으로 확장되지 않고 -name '*.avi'
텍스트가 명령 *.avi
에 그대로 전달되도록 작은따옴표를 사용하십시오 .find
find
노트 2:서로 다른 디렉터리에 있지만 파일 이름이 동일한 파일 이름이 여러 개 있는 경우 이 mv
명령은 해당 파일을 모두 동일한 디렉터리로 이동하고 이름이 같은 파일이 서로 덮어쓰게 됩니다. 다음 명령을 사용하여 이를 방지할 수 있습니다 mv -n
(파괴 모드 없음).