名前に日付を含むファイルをディレクトリに移動する

名前に日付を含むファイルをディレクトリに移動する

cronjobsで設定できるスクリプトを使用して日付別にファイルを並べ替えるのに役立ちます。ディレクトリを抽出して生成する文字列は次のとおりです。YYYYMMDDDHMMSS、すべてのファイル名に存在します。

# ls
AB.CDEFGHIJ0KLM_NO_1234P5678_QR_9012_YYYYMMDDHHMMSS_345678_ETH2_Testing-run_0.msg

つまり、ABC.DVCSR1234_20191101120130_BLAH_97.msgのソースは次のとおりです。

/home/user/files/AB.CDEFGHIJ0KLM_NO_1234P5678_QR_9012_YYYYMMDDHHMMSS_345678_ETH2_Testing-run_0.msg

到着

/home/user/files/2019/11/01/AB.CDEFGHIJ0KLM_NO_1234P5678_QR_9012_YYYYMMDDHHMMSS_345678_ETH2_Testing-run_0.msg

ファイル構造に再構成する必要がある何千ものファイルがあります。

答え1

移動したいファイルに次のパターンが含まれているとします_YYYYMMDDHHMMSS_

#!/bin/bash

cd /home/user/files
for file in *.msg; do
  date=$(printf "$file" | sed -nE 's/.*_([0-9]{4})([01][0-9])([0-3][0-9])[0-2][0-9][0-6][0-9][0-6][0-9]_.*/\1\/\2\/\3/p')
  if [ -n "$date" ]; then
    mkdir -p "$date" && mv "$file" "$date"
  fi
done

答え2

ハッキング方法。 lsの解析が悪いこと、ファイル名の空白が原因で問題が発生することなどの一般的な免責事項です。

フォルダを作成します。すべての月は31日だと仮定します!

mkdir -p {2017..2019}/{01..12}/{01..31}

何をするかプレビュー

ls ABC* | awk -F_ '{ print "mv",$0,substr($2,0,4)"/"substr($2,5,2)"/"substr($2,7,2)"/"$0}'

実際に実行するには、上記と同じコマンドを使用しますが、| shフラグを使用してください。

ls ABC* | awk -F_ '{ print "mv",$0,substr($2,0,4)"/"substr($2,5,2)"/"substr($2,7,2)"/"$0}' | sh

答え3

この問題を解決するために、以下を使用しましたfind

find . -type f -name "*.msg" -exec bash -c 'DIRS=$(echo ${0} | cut -d'_' -f2); mkdir -p "${DIRS:0:4}/${DIRS:5:2}/${DIRS:7:2}"; mv "${0}" "${DIRS:0:4}/${DIRS:5:2}/${DIRS:7:2}"' {} \;

関連情報