2017-11-11 5 views
0

リスト($ docs)のフォルダ名のセットを監視するスクリプトがあります。 フォルダが空でないことがわかった場合、ファイルの名前を変更して移動し、タイムスタンプを追加する必要があります。Bash:名前を変更した正規表現に書式付きの日付を含める

これは私がこれまでに得たものである:

docs="/home/user/docs.txt" 

cat $docs | while read line 
do 
if find "$line" -mindepth 1 -print-quit | grep -q .; then 
    find $line -type f | rename 's:(^|.*/)([^/]*)/([^/]*)$:/tmp/$2$3 
else 
    echo "empty folders" $line 
fi 
done 

ファイルdocs.txtは次のように記載されているフォルダのセットです:

/foldername 
/anotherfoldername 

このスクリプトは正しく私のファイルの名前を変更します(folderplacement_filename.ext )、それらを/ temp /ディレクトリに移動します。

しかし、「日付+%d%m%Y%H%M%S」という文字列が追加されており、これを名前を変更した文字列に正常に追加する方法が見つかりません。

$(日付)を追加すると、余分な書式設定は無視されます。例えば

年代の名前を変更への追記:(。^ | /)([^ /])/([^ /] *)$:を/ tmp/$ 2 $ 3 $(日) は、ファイル名を与えます

"4 24 35 20 48 111 123 321をfolderplacement_filename.ext" 私は(.EXTでもokです後の日付を追加する。)ファイルは、 "folderplacement_filename11102017011632.ext" のように見えるようにしたいよう

これはおそらくです私が引用するか、または正しい方法でかっこにする必要がある何か、私はそれを把握することはできません。

答えて

0

名前の変更に関する経験はありませんが、その行の最後に引用符がありません。

シングルクォートを使用している場合、シェルは変数を展開しません。つまり、コマンド引数の最後の部分は実際には$(date)です。これはあなたが望むものではありません。二重引用符を使用することもできますが、それは円弧で$すべてをエスケープする必要があることを意味します。または、日付部分を一重引用符の外に置くことができます。

now=$(date +%d%m%Y%H%M%S) 
find $line -type f | rename 's:(^|.*/)([^/]*)/([^/]*)$:/tmp/$2$3'$now 
+0

ありがとうございます!これは正しい軌道に乗った。 [^ /。*]([^ /] *)/([^ /] *)\ $:/を二重引用符でエスケープして解決しました。 tmp/$ now \ _ \ $ 2 \ $ 3 \ $ 4: "あなたは欠けているものを見つけ出すのも正しいです。"これはスクリプトには見付かりませんでした。 – Stian

関連する問題