모든 확장자를 가진 파일을 하위 디렉터리로 이동하는 방법은 무엇입니까?

모든 확장자를 가진 파일을 하위 디렉터리로 이동하는 방법은 무엇입니까?

디렉토리가 있습니다/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)모든 이름과 일치합니다 ..mp4rest

shell 옵션을 사용 extglob하면 확장된 와일드카드 패턴을 사용할 수 bash있으며 dotglobshell 옵션을 사용하면 숨겨진 이름과 일치하는 쉘 와일드카드를 사용할 수 있습니다.

답변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의 솔루션만 사용하고 유지했습니다.

관련 정보