확장자를 기준으로 파일을 찾고 복사하는 방법은 무엇입니까?

확장자를 기준으로 파일을 찾고 복사하는 방법은 무엇입니까?

photorec복구된 파일이 포함된 2481개의 폴더가 포함된 데이터 복구 프로세스의 폴더가 있습니다 .

폴더 이름의 순서는 recup_dir.1, recup_dir.2...recup_dir.2481입니다.

다음을 사용하여 이 폴더의 모든 확장명 목록을 얻었습니다.

find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u

photorecorg따라서 위 명령으로 얻은 각 확장명에 해당하는 폴더 목록이 포함된 또 다른 디렉터리를 만들었습니다 .

mkdir 7z arj asf avi bat blend bmp bz2 cdr DOC docx flac flv gif gz html jpg mobi mov mp3 mp4 mpg ods odt ogg pdf php png ppt ps psd rar rtf svg swf tar tif ttf wav wmf xcf xls xlsx xz zip

이제 폴더의 파일을 photorec다음 확장 폴더로 복사해야 합니다 photorecorg.

상상find . -print | xargs cp $0 ../photorecorg/<extension>

각 확장 디렉터리에 파일을 찾아서 복사할 수 있는 명령은 무엇입니까?

답변1

photorec='/pathto/your_photo_recovery_folder'
photorecorg='/pathto/your_photo_recorg_folder'

cd "$photorec" && \
   EXTDIR="$photorecorg" find . -type f -name '*.?*' -exec sh -c '
      for f
      do
         dest=${EXTDIR}/${f##*.}
         cp -p "$f" "$dest/."
      done
   ' x {} +

답변2

달리기다루기 힘든. autoload zmv직접 입력하세요 ~/.zshrc(또는 시험해 보려면 zsh 명령줄에 입력하세요). 그런 다음 사용할 수 있습니다zmv기능파일을 이동하거나 복사합니다.

mv -Q '**/*(.)' '$f:e/$f:t'

설명: 첫 번째 피연산자는 이동할 파일의 모드이고 두 번째 피연산자는 대체 모드입니다. **/하위 디렉터리의 파일을 재귀적으로 일치시킵니다. (.)글로벌 예선, 일치 항목을 일반 파일로 제한합니다(따라서 디렉터리 일치 위험이 없습니다). 교체 모드에서는 $f원래 경로를 지정하고,수정자 e확장자만 유지되고 t전체 기본 이름은 유지됩니다.

답변3

@user218374 외에도mkdir -p.

photorec='/media/TiloDataRecoveryRAW'
photorecorg='/media//TiloDataRecoveryOrg'

cd "$photorec" && \
   EXTDIR="$photorecorg" find . -type f -name '*.?*' -exec sh -c '
      for f
      do
         dest=${EXTDIR}/${f##*.}
         mkdir -p "$dest" && cp -p "$f" "$dest/."
      done
   ' x {} +

관련 정보