![모든 확장자를 가진 파일을 하위 디렉터리로 이동하는 방법은 무엇입니까?](https://linux55.com/image/161295/%EB%AA%A8%EB%93%A0%20%ED%99%95%EC%9E%A5%EC%9E%90%EB%A5%BC%20%EA%B0%80%EC%A7%84%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EB%A1%9C%20%EC%9D%B4%EB%8F%99%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
디렉토리가 있습니다/media/home/Seagate Expansion Drive/Downloads/Java Spring Gurus/folder1 .../folder2 .../foldern
*.mp4
각 디렉토리에는 다양한 유형(* .srt, *.pdf
등) 의 파일과 추가 파일이 있습니다 . *.mp4
그 안에 모든 것을 보관하고 다른 파일을 folderx
만들고 이동하고 싶습니다 .folderx/rest/
어떻게 해야 하나요?
나는 시도했다:
for files in $(find "/media/sergio/Seagate Expansion Drive/DOWNS/Spring Framework 5" | grep -P "([.]srt$)|([.]pdf$)")
do
mv $files /resto
done
하지만 난 오류가 많아
mv: 셀 수 없음
답변1
find
나는 이것을 실제로 사용하는 것을 보지 못했습니다 . 모든 것이 어디에 있는지 정확히 알 수 있으므로 파일을 찾을 필요가 없습니다.
bash
대신 쉘을 사용한다고 가정하면 ,
#!/bin/bash
shopt -s extglob dotglob
for dirpath in '/media/home/Seagate Expansion Drive/Downloads/Java Spring Gurus'/folder*/
do
mkdir -p "$dirpath"/rest &&
mv -i "$dirpath"/!(*.mp4|rest) "$dirpath"/rest
done
이것은 모든 디렉토리를 반복합니다 folder*
. 이러한 각 디렉터리에 대해 rest
그 안에 하위 디렉터리를 만든 다음 일치하지 않는 모든 항목 *.mp4
(또는 rest
디렉터리 자체)을 해당 디렉터리로 이동합니다.
확장된 와일드카드 패턴은 , 및 not 로 끝나지 않는 !(*.mp4|rest)
모든 이름과 일치합니다 ..mp4
rest
shell 옵션을 사용 extglob
하면 확장된 와일드카드 패턴을 사용할 수 bash
있으며 dotglob
shell 옵션을 사용하면 숨겨진 이름과 일치하는 쉘 와일드카드를 사용할 수 있습니다.
답변2
이 명령은 예상한 대로 작동해야 합니다.
find "/media/sergio/Seagate Expansion Drive/DOWNS/Spring Framework 5" -type f \! -iname '*.mp4' -execdir mkdir -p rest \; -execdir mv "{}" rest/ \;
이 명령에서:
-type f
: 파일만 일치합니다(디렉토리, 심볼릭 링크 또는 특수 파일 이동 방지).\!
: 논리적 "NOT" 역할을 합니다.-iname
: 이름이 일치하는 파일을 선택합니다. 대소문자를 구분하지 않습니다(-name
대소문자를 일치시키려는 경우 사용).-execdir
: 일치하는 파일이 포함된 하위 디렉터리에서 명령을 실행합니다. 그 중 두 개가 필요합니다. 하나는 폴더를 생성rest/
하고 다른 하나는 파일을 폴더로 이동합니다.
편집: 누락된 선행을 추가하고 \;
하나 execdir
의 솔루션만 사용하고 유지했습니다.