50개의 폴더와 일부 하위 폴더에 총 1000개가 넘는 오디오 파일이 있습니다. 모든 하위 폴더를 삭제하고 모든 파일을 현재 레벨에 넣어야 합니다. 이것을 시도했지만 mv */* ./
불평합니다: 매개변수 목록이 너무 깁니다.
답변1
오디오 파일 확장자가 .mp3라고 가정합니다.
find <AudioFolderPath> -name '*.mp3' -exec mv -it <YourTargetFolder> {} +
노트:
.mp3
오디오 파일 확장자로 바꾸세요 .<AudioParentFolderPath>
하위 폴더가 포함된 상위 폴더로 대체됩니다 .<YourTargetFolder>
모든 파일을 배치해야 하는 폴더의 경로로 바꾸십시오 .서로 다른 하위 폴더에 있는 두 파일의 이름이 같은 경우하나만 이동됩니다.
편집하다:~처럼코스타스" -i
스위치는 mv
대화형이며 기존 파일을 덮어쓰기 전에 메시지를 표시합니다." 라고 말합니다.
답변2
find . -type f -mindepth 2 -exec mv -t ./ {} +
이 명령은 동일한 이름을 가진 모든 파일을 덮어씁니다. 덮어쓰기 전에 메시지를 표시하는 데 이를 사용할 수 있습니다.
find . -type f -mindepth 2 -exec mv -it ./ {} +
설명하다
-type f
: 일반 파일만 찾습니다.-mindepth 2
: 하위 디렉터리에 있는 파일만 찾습니다.-exec mv -it ./ {}
:-exec
"이것을 실행하라"는 뜻주문하다발견된 각 파일에."는 대화식{}
으로 filename. 스위치로 대체되어-i
기존mv
파일을 덮어쓰기 전에 메시지를 표시하고-t
대상 디렉터리를./
.+
: 쉘이 작동할 수 있는 만큼의 파일을 하나의 인수 줄에 함께 넣습니다.주문하다인용하다주문하다최소 횟수(일대일이 아니라 일대다)입니다.
빈 폴더를 추가로 삭제하려면 동일한 수신 방법을 사용할 수 있습니다.
find . -type d -empty -delete
답변3
execve()
예, 이는 외부 명령을 실행할 때 시스템 호출에 전달되는 인수 및 환경의 누적 크기에 대한 제한입니다.
의 경우 zsh
내장 함수를 mv
대신 사용할 수 있습니다.
zmodload -F zsh/files +b:zf_mv
zf_mv ./*/* .
또는 zargs
목록을 관리 가능한 덩어리로 분할하는 방법을 사용하세요.
autoload zargs
zargs -Ifiles ./*/* -- mv files .
그리고 ksh93
:
command -x mv ./*/* .
쉘이 내장된 GNU xargs
및 GNU의 경우 (주로 주목할만한 예외):mv
printf
mksh
printf '%s\0' ./*/* | xargs -r0 mv -t .
답변4
상당히 이식 가능한 솔루션은 다음과 같습니다.
각 하위 폴더에서 모든 파일을 찾아 현재 디렉터리로 이동합니다.
find ./*/ -type f -print | xargs mv -i "{}" ./
| egrep "\.au$|\.mp3$|\.ac3$"
중간에 하나를 추가하여 찾은 파일이 오디오 확장자를 가진 파일인지 확인할 수 있습니다(모든 유형을 포괄하는 데 필요한만큼 확장자를 추가하세요. 저는 일반적인 확장자 3개만 제공했습니다) .