디렉토리 및 하위 디렉토리에서 다른 디렉토리로 재귀 적으로 유형별로 파일을 이동하려면 어떻게해야합니까?


30

디렉토리와 모든 서브 디렉토리에서 파일 유형을 이동하는 좋은 방법은 무엇입니까?

"/ thisdir의 모든 * .ogg를 재귀 적으로 / somedir로 이동"과 같이. 나는 몇 가지를 시도했다; 나의 최선의 노력은 (여전히 그렇게 크지는 않았다) :

find /thisdir -type f -name '*.ogg' -exec mv /somedir {} \;

각 파일 이름 앞에 각 줄에 반환되었습니다.

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'

답변:


23

당신과 함께 찾기를 사용할 수 xargs를 이것에 대한

find /thisdir -type f -name "*.ogg" -print0 | xargs -0 -Imysongs mv -i mysongs /somedir

위 명령에서 -I는 xargs에게 사용하려는 대체 문자열을 알려줍니다 (그렇지 않으면 명령 끝에 인수를 추가합니다).

또는
명령에서 명령 뒤에 '{}'을 (를) 이동하십시오 mv.

find /thisdir -type f -name '*.ogg' -exec mv -i {} /somedir \;


1
위의 명령을 시도하기 전에 백업을 잊지 마십시오 :-).
Hemant

2
파일 이름 문제에서 공백을 피하려면 find의 경우 첫 번째 -print0의 경우 Btw, xargs의 경우 -0을 사용해야합니다.
maxschlepzig 2018 년

@ maxschlepzig : 좋은 지적입니다. 편집하겠습니다.
Hemant

2
mv -i여기서 사용하는 것이 좋습니다 . 예기치 않은 일이 발생해도 파일을 덮어 쓸 위험이 없습니다.
Gilles 'SO- 악마 그만'

2
gnu core utils의 mv를 사용하면 mv -t <targetdir>\ 대신 +를 사용할 수 있습니다 .

10
find /thisdir -type f -name "*.ogg" -exec mv {} /somedir \;

당신은 mv에 대한 인수를 교환했습니다.


9

zsh 또는 bash 4에서 모든 *.ogg파일을 /somedir다음 위치에 수집하십시오 .

mv /thisdir/**/*.ogg /somedir

디렉토리 계층을 재현하려는 경우 : (경고, 브라우저에 직접 입력)

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir

bash에서 편리함
Mark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.