![拡張子[重複]に基づいてディレクトリ(およびサブディレクトリ)のすべてのファイルを新しいフォルダに移動するスクリプト](https://linux33.com/image/96683/%E6%8B%A1%E5%BC%B5%E5%AD%90%5B%E9%87%8D%E8%A4%87%5D%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%84%E3%81%A6%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%EF%BC%88%E3%81%8A%E3%82%88%E3%81%B3%E3%82%B5%E3%83%96%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%EF%BC%89%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%96%B0%E3%81%97%E3%81%84%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AB%E7%A7%BB%E5%8B%95%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88.png)
micro-sdカードを復元するには、photorecを使用する必要があります。複数のファイル拡張子を含む他の多くのディレクトリを含むディレクトリが残りました。ファイル拡張子に基づいて各ファイルを新しいディレクトリに移動したいと思います。
*.jpg /SortedDir/jpg ディレクトリに移動
*.gifが/SortedDir/gifディレクトリに移動されました。
拡張子や*.<'blank>を持たない生ファイルも考慮してください。
Windows で一括でこの操作を正常に実行しました。
@Echo OFF
Set "Folder=C:\MessyDir"
Set "DestDir=C:\SortedDir"
FOR /R "%Folder%" %%# in ("*") DO (
If not exist "%DestDir%\%%~x#" (MKDIR "%DestDir%\%%~x#")
Echo [+] Moving: "%%~nx#"
Move "%%#" "%DestDir%\%%~x#\" 1>NUL
)
Pause&Exit
Linuxスクリプトのバージョンを探しています。
ありがとうございます! !
答え1
ソートされていないファイルがすべてにあり、messy_dir
サブディレクトリがにあると仮定すると、sorted_dir
次のことができます。
(cd sorted_dir; mkdir jpg gif)
find messy_dir -type f \( -iname '*.jpg' -exec mv {} ../sorted_dir/jpg/ \; -o \
-iname '*.gif' -exec mv {} ../sorted_dir/gif/ \; \)
これは改善することができますが、良い出発点になります。
スクリプトが必要な場合は、以下を試してください。
#!/bin/bash
# Check assumptions
[ "$#" -eq 2 ] || exit 1
[ -d "$1" ] || exit 1
find "$1" -type f -name '*?.?*' -exec sh -c '
mkdir -p "$2/${1##*.}" && mv "$1" "$2/${1##*.}"
' find-sh {} "$2" \;
答え2
いくつかのパラメータを使用してください。
#!/bin/bash
# collect directory names
MessyDir="$1"
SortedDir="$2"
# test if user supplied two arguments
if [ -z $2 ]; then
echo "Error: command missing output directory"
echo "Usage: $0 input_dir output_dir"
exit 1
fi
# read recursively through MessyDir for files
find $MessyDir -type f | while read fname; do
# form out_dir name from user supplied name and file extension
out_dir="$SortedDir/${fname##*.}"
# test if out_dir exists, if not, then create it
if [ ! -d "$out_dir" ]; then
mkdir -p "$out_dir"
fi
# move file to out_dir
mv -v "$fname" "$SortedDir/${fname##*.}"
done
これは必要以上に時間がかかり、変数の拡張 ${fname##*} のために Bash 4 以上が必要です。これはbasename呼び出しを避け、photorecでうまく機能します。また、このスクリプトはjpgとgifだけでなく、photorecからエクスポートされたすべてのファイル形式でも機能します。