私はそれを研究しました。
ls -dtr1 * | tail -5 | awk 'NR==2'
最近作成された5つのフォルダのうち、最後から2番目のフォルダを一覧表示します。
forループで使用したいので、シェルスクリプトを作成しました。forLoopExample.sh
for ii in $(seq 1 $1)
do
f_name=`ls -dtr1 * | tail -$1 | awk 'NR==$ii'`
# mkdir $f_name in some other location
# and some other operations
done
sh forLoopExample.sh 3
ループを実行すると3回実行され、3つのフォルダすべてで予想される操作が実行されることが予想されました。しかし、mkdir
エラーが発生します。
このエラーを解決するのに役立ちます。よろしくお願いします。
答え1
コードには少なくとも3つの問題があります。
awk
プログラムでシェル変数を使用しようとしています。正しい方法は、awk
シェル変数の値を使用して変数を生成することです。awk -v line="$ii" 'NR == line'
/* ... */
シェルスクリプトで C と同様のコメントを使用できます。シェルスクリプトのコメントは、#
次の改行文字で始まり拡張されます。ls
タイムスタンプ順に名前を取得するには、解析を使用します。名前に改行文字が含まれていると中断されます。代わりに、次のようなものを使用してください。f_name=$( zsh -c 'print -rC1 *(/om[$1])' zsh "$ii" )
これはzsh
シェルを使用してii
現在のディレクトリから:th最後に変更されたディレクトリの名前を取得します。mtime
ディレクトリのタイムスタンプは、既存のファイルが更新されたとき、またはコンテンツがサブディレクトリに追加または削除されるときではなく、ディレクトリエントリがディレクトリから追加または削除されたときに更新されます。
では、zsh
タイムスタンプの順序に従って現在のディレクトリのディレクトリを繰り返しますmtime
。
for dir in *(/om); do
# use "$dir" here
done
最後に変更された最初のディレクトリだけを繰り返すパターン*(/om[1,$1])
として使用されます。$1
また見なさい: