forループ内のtailコマンド

forループ内のtailコマンド

私はそれを研究しました。

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つの問題があります。

  1. awkプログラムでシェル変数を使用しようとしています。正しい方法は、awkシェル変数の値を使用して変数を生成することです。

     awk -v line="$ii" 'NR == line'
    
  2. /* ... */シェルスクリプトで C と同様のコメントを使用できます。シェルスクリプトのコメントは、#次の改行文字で始まり拡張されます。

  3. 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

また見なさい:

関連情報