
タイムスタンプに基づいてファイル名を変更するスクリプトの作成を開始しました。コマンドラインで解決したと思いましたが、スクリプトでは機能しません。スクリプトは awk 行に停止します。
これはこれまでの小さなスクリプトです。
#!/bin/bash
#renamePhotos.sh
# a script to rename photos in current directory based on date
# to be expanded
# OUTPUT in $(ls -tr *.JPG);
LIST="$(ls --full-time -tr *.JPG)"
echo "Starting..."
for i in "$LIST"; do
echo $(awk '{ print $6 }' | awk 'BEGIN { FS = "-" }; { print $1 }')
echo
done
答え1
この行では:
echo $(awk '{ print $6 }' | awk 'BEGIN { FS = "-" }; { print $1 }')
コマンド置換の最初の awk は入力を指定しないので、端末に接続された stdin から読み取られます。つまり、ユーザーが入力するのを待ちます。
シェル変数からいくつかの入力を提供するには、次のようにパイプできます。
echo "$var" | awk...
echoはコマンドの出力のみを印刷するので、これを行うのはecho $(foo bar)
奇妙です。foo bar
これは、スタンドアロンで実行した場合、いずれにせよ発生します。foo bar
(単語の噴射を除いて、おそらくあなたが望むものではありません。)
forループもあります。
for i in "$LIST"; do
一度だけ実行され、i
値に設定されますLIST
。引用されているので、$LIST
トークン化を経ずにリストfor
に1つの項目しか表示されません。ただし、引用符なしでこれを行うと( に示すように)、スペースfor i in $LIST; do...
で区切られます。IFS
これを防ぐには、改行文字を設定する必要があります。
それでも可能な問題は、出力がls
少しトリッキーになる可能性があることです。時間形式はロケールによって変更される可能性があります(それが起こるかどうかはわかりませんが--full-time
)、ファイル名から印刷できない文字が壊れる可能性があります。ロケールを知っていて、ファイル名が「良い」場合は機能することがあります。
もう1つの方法は、シェルにファイルを検索させdate --reference $file
(使用可能な場合)、次のようなものを使用して日付を取得することです。
for f in *.jpg ; do
d=$(date +"%Y-%m-%d" -r "$f")
echo "$d $f"
done
(GNU coreutilsにはフラグdate
があります。OS Xではファイルの代わりに時間がかかります。)--reference
date -r