web-dev-qa-db-ja.com

ファイル名の日付に基づいてファイルをフォルダに並べ替えますか?

解決済み:コメントの更新を参照してください。

ファイル名に日付が含まれているファイルを、その日付に基づいてフォルダーに並べ替えようとしています。このように、ファイル名にスペースが含まれていたファイル。古いファイルがいくつかあるので、それらも並べ替える必要があります。

ディスパッチFax_20180521121901.pdf

ファイル名にスペースを含まないファイルを取得しているので、Dispatch_20180521124202.pdfだけです。

日付は20180521で、残りはメッセージIDだと思いますが、それは必要ありません。ちょうど日付。

このbashスクリプト(ubuntu 18.04ボックス)での試みは、ファイルが存在する場所から1ディレクトリレベル上の2018-05-21という単一のフォルダーを作成し、すべてのpdfファイルをそのフォルダーに配置することになりました。

    for x in /home/tb/temp/*.pdf
do
    d=$(date -r "$x" +%Y-%m-%d)
    mkdir -p "$d"
    mv -- "$x" "$d/"
done

どういうわけか「e」というフォルダに移動してしまいました。

for x in /home/tb/temp/*.pdf
do
    d="${x:4:4}-${x:8:2}-${x:10:2}"
    mkdir -p "$d"
    mv -- "$x" "$d/"
done

この試み?最終的にPDFごとにフォルダーが作成されました。

/home/tb/20180521124202.pdf/Dispatch Fax_20180521124202.pdf /home/tb/20180521121901.pdf/Dispatch Fax_20180521121901.pdf

for x in /home/tb/temp/*.pdf
do
    d=$(echo "$x" | awk -F _ '{print $2}')
    mkdir -p "$d"
    mv -- "$x" "$d/"
done

スクリプトは以前の投稿からのものです ここここ そしてそれらはそれらのために働きました、しかし私は目標が同じであるにもかかわらず同じ運を持っていません。

私の目標は、最終的にrsyncから一時ディレクトリにデータを入力し(これらのファイルを別のサーバーからプルする)、次にcronを介して、このスクリプトを実行して日付に基づいてフォルダーに移動し、「オプション+インデックス」を有効にしてApacheを介して提供することです。これはイントラネットのみのページであり、この特定のマシンには外部からのアクセスがありません。ディレクトリ構造は単純です。最終的には、YYYY/MM/DD形式に従って、/ var/www/html/2018/5/21などのようになります。

これを機能させる方法がわからなくなっており、bashスクリプトに関する知識が非常に錆びています。 this one のような他のいくつかの例を見てきましたが、ファイル名にスペースが含まれているファイルでは機能しないことがわかりました。

私はアイデアを受け入れています!

1
Taco Bob

積極的に敵対的なファイル名を処理する必要がない場合は、

sed -E 's/([0-9]{0,7}[^0-9]+)*([0-9]{8}).*/mkdir -p \2; mv "&" \2/e'
#         111111111111111111 2222222222 

このパターンは、0から7桁の後に、いくつかの非桁が続き、何度でも、その後に8桁が1回続きます。 2番目のパターンである8桁のパターンは、日付と一致します。

GNU sedがない場合は、eフラグの代わりに結果をシェルにパイプできます。

1
jthill