2017-02-16 3 views
-2

に対応するフォルダにファイルを移動するためにどのように私のようなファイルとフォルダを持っている:ファイルが現在の月にない場合バッシュ

20170129-aaa.jpg 
20170130-bbb.jpg 
20170131-ccc.jpg 
20170201-ddd.jpg 
20170202-eee.jpg 

を、私はのYYYYMMの一部に基づいてフォルダを作成したいのですがそのファイルを対応するフォルダに移動します。 (例えば、20170129-aaa.jpg->201701/20170129-aaa.jpg)。しかし、今月のファイルがある場合はそのまま残したいと思います。 私はbashのに新たなんだ、awkは、uniqの、部分文字列の私の試みはすべて失敗しています。どうすればこの作品を作れますか? bashで、このようなあなたのファイルを介し

+0

各行のループ{dir = $(カット-d ' - ' -f1行); mkdir $ dir; mv line $ dir} –

+0

ありがとうございます。私はちょうどYYYYMMの部分が必要なので、 ' - 'で切った部分はここではあまり適用されません。 –

+0

たぶん、各行の最初の6桁を一時ファイルに書き、 'uniq'を使ってYYYYMMを抽出する必要がありますか?私はこれがスクリプトをあまりにも大きくするかもしれないと思っています。より軽い方法がありますか? –

答えて

2

あなたは可能性がループ:

shopt -s nullglob 
today=$(date +%Y%m) 
for file in ${today}??-???.jpg; do 
    dir=${file:0:6} 
    mkdir -p "$dir" || continue 
    mv "$file" "$dir/$file" 
done 
  • date +%Y%MがYYYYMM形式で現在の日付が
  • shopt -s nullglobは確かグロブが一致するファイル
  • の場合は何も展開させ抽出し、
  • グロブ${today}??-???.jpgは、ループが一致するファイルをピックアップすることを確認します。
  • dir=${file:0:6}は、Y

    • :ファイル名
    • mkdir -pからYYYMM部分は、ディレクトリは、ディレクトリの作成が

    関連記事を失敗した場合

  • || continueは、ファイルをスキップします(ディレクトリがすでに存在する場合は無視します)を作成します

    YYYY-MM-DD format date in shell script

  • Extract substring in Bash

  • shoptのGNU Bashマニュアル。

+0

ありがとうございました。私の悪い、私は私の最初の投稿の要件を逃した。今月にないファイルだけをそのディレクトリに移動したいと思います。しかし、今月のものはそのまま残すべきです。 –

+0

このサイトの 'man date'やいくつかの検索を見ると、自分でロジックを構築するのに役立ちます。それは非常に簡単な変更です。 – codeforester

+0

私はここに来てから何時間もGoogleでさまざまなキーワードを検索しました。まあ、明らかにそれは正しいキーワードを見つけることが私のせいです。 –

0
IDX=$(ls *.jpg -1 | xargs -n1 basename | cut -b 1-6 | uniq | wc -l) 
for YYYYMM in $(ls $FILEDIR/*.jpg -1 | xargs -n1 basename | cut -b 1-6 | uniq | head -$(($IDX-1))); 
do 
    mkdir -p $FILEDIR/$YYYYMM 
    mv "$FILEDIR/$YYYYMM"*.jpg $FILEDIR/$YYYYMM 
done 
+1

大きな努力。私はこれがうまくいくかもしれないと思っています。更新された回答をご覧ください。 SOは、bashスクリプトの学習に最適な場所です。有益なエキスパートがたくさんあります。私は数ヶ月しかここにいないし、かなり学んだことがある。 – codeforester

+0

あなたのコンピュータ上の 'man bash'は素晴らしいリソースになります。 – codeforester

+1

あなたはいい男です。本当にありがとうございました。良い一日を過ごしてください。 –

1

このスクリプトは、何をしたいん(codeforesterからの応答に基づいて):

curmonth=$(date +%Y%m) 
for filename in ????????-???.jpg; do 
    filemonth=${filename:0:6} 
    [ $curmonth = $filemonth ] && continue; 
    [ ! -d $curmonth ] && mkdir $curmonth 
    if [ ! -d $curmonth/. ]; then 
    echo "$0: error: Can not create directory $curmonth" 
    break 
    fi 
    mv $filename $curmonth 
done 
  1. 変数は、現在の年の月保持しています。
  2. を持つすべてのファイル "???????? - 。?? JPG" のパターンを調べています。抽出されたファイル名に
  3. 月。
  4. ファイルの月は現在の1に等しい場合は、保存先ディレクトリを存在しない場合
  5. をスキップし、それを作成
  6. 先ディレクトリがあることを確認し、そうでない場合は、破壊的な
  7. をオンMV最後にファイルを移動

バグは、このコードである:それは「201702」のような先のディレクトリは、すでに存在するが、それはない書き込み可能であることを起これば、その後mvは失敗します。ディレクトリが存在しない場合は作成され、作成されたディレクトリは書き込み可能であると想定されます(通常は... 100%確信していますか?):