ファイルプレフィックスに基づいて名前付きディレクトリにファイルを並べ替える

ファイルプレフィックスに基づいて名前付きディレクトリにファイルを並べ替える

このようなファイルがたくさんあります。

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'

関連情報