
このようなファイルがたくさんあります。
5830_1.png
5830_2.png
5830_3.png
5831_1.png
5832_1.png
5832_2.png
これらのファイルのすべてを、ファイル名プレフィックスをディレクトリ名として使用してディレクトリにソートしたいと思います。
だから私は終わります
5830/
5830_1.png
5831_2.png
...etc
5831/
5832/
見つけることができるショートカットがありますか?
答え1
POSIXsh
ライン:
for file in *.png; do mkdir -p -- "${file%%_*}" && \
mv -- "$file" "${file%%_*}"; done
説明する:
.png
現在のディレクトリの各ファイルを繰り返します。mkdir
ファイルプレフィックスを使用し、${file%%_*}
最初のアンダースコアとその後のすべてのエントリを削除して、ディレクトリがすでに-p
存在する場合は自動的に保持されます。mkdir
mv
ファイルをディレクトリに配置します。
以下のHalosGhostの提案に従い、希望する最終構造が次のような場合
5830/
1.png
2.png
3.png
5831/
1.png
5832/
1.png
2.png
上記の行は少し変更できます。
for file in *.png; do mkdir -p -- "${file%%_*}" && \
mv -- "${file}" "${file%%_*}/${file##*_}"; done
今回は、ターゲットはディレクトリ${file%%_*}
($file
アンダースコアの前)と新しいファイル名${file##*_}
($file
アンダースコアの後ろ)で構成されます。
答え2
私は複数の書類を整理するためにこのようなことを何度もしなければなりませんでした。私はbash変数の拡張があなたの友人であることがわかりました。
${parameter%word}
${parameter%%word}
一致するサフィックスパターンを削除します。パス名拡張と同様に、単語を拡張してパターンを生成します。
デフォルト設定:
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5830_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5830_2.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5830_3.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5831_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5832_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5832_2.png
$ for i in $(find . -maxdepth 1 -type f); do mkdir -p ${i%_*};mv -v $i ${i%_*}; done
'./5830_3.png' -> './5830/5830_3.png'
'./5831_1.png' -> './5831/5831_1.png'
'./5830_1.png' -> './5830/5830_1.png'
'./5832_1.png' -> './5832/5832_1.png'
'./5832_2.png' -> './5832/5832_2.png'
'./5830_2.png' -> './5830/5830_2.png'
より具体的な情報を得るには、findで "-name * png"または他のフラグを使用することもできます。指定したディレクトリでのみ照会を確認するようにmaxlengthを設定して実行しました。これにより、ディレクトリに追加の画像が追加された場合は、変更せずに再実行されます。また、%%の代わりに%を使用しているため、下線を含むディレクトリ全体を指定する必要がある場合(例: "/home/user/my_files/pngs")、この機能は中断されません。
$ for i in $(find move_files -maxdepth 1 -type f); do mkdir -p ${i%_*};mv -v $i ${i%_*}; done
'move_files/5830_3.png' -> 'move_files/5830/5830_3.png'
'move_files/5831_1.png' -> 'move_files/5831/5831_1.png'
'move_files/5830_1.png' -> 'move_files/5830/5830_1.png'
'move_files/5832_1.png' -> 'move_files/5832/5832_1.png'
'move_files/5832_2.png' -> 'move_files/5832/5832_2.png'
'move_files/5830_2.png' -> 'move_files/5830/5830_2.png'