シェルスクリプトでディレクトリ作業ディレクトリを古いディレクトリに変更する

シェルスクリプトでディレクトリ作業ディレクトリを古いディレクトリに変更する

以下を達成する方法はありますか?私は私の使命だけを行うことができます。

シェルスクリプトを作成し、同じ月にスクリプトが実行された場合にのみ正しい出力が提供されます。

以下は、スクリプトが使用するコマンドです。

cd $(find /home/application/Files/output/$(date +%Y)/$(date +%m) -type d|sort -r |head -1)

以下は、システムに実際に存在するディレクトリ形式です。

 /home/application/Files/output/2018/01/30

これで問題は、スクリプトを実行すると次のエラーが発生することです。

 find: `/home/application/Files/output/2018/02': No such file or directory

../2018/02まだ作成されていないディレクトリを探しているので/home/application/Files/output/2018/01/30

答え1

まだ存在していないYYYY/MM/DD/ディレクトリを検索するのはなぜですか?

cd最寄りのYYYY / MM / DD /ディレクトリを検索して検索します。

cd "$(find /home/application/Files/output/ -type d \
       -regex '.*/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]$' -print0 | 
     sort -rVz | head -z -n 1)"

注:GNU find、、、、as sort、およびNUL区切り文字オ​​プションが必要です。head-print0-z

PCREスタイルの正規表現を好む場合は、次のことができます。

cd "$(find /home/application/Files/output/ -type d -print0 | 
        grep -z -P '/\d{4}/\d\d/\d\d$' | sort -rVz | head -z -n 1)"

または、今日のディレクトリを使用する必要がある場合は、空であるかどうかにかかわらず、まずディレクトリを作成してからcd入力します。

dir="/home/application/Files/output/$(date +%Y/%M/%d)"
mkdir -p "$dir"
cd "$dir"

mkdirオプションは、-pディレクトリがまだ存在しない場合にディレクトリを作成します。また、必要な親ディレクトリも作成されます。ディレクトリがすでに存在する場合、エラーや苦情は発生しません。

答え2

GNUdateおよびbash(またはksh93)を使用して今日のディレクトリを選択しますが、その日付のディレクトリが見つからない場合は、既存のディレクトリが見つかるまで一度に1日ずつ戻ります(または最大30日まで戻る)。

for (( i = 0; i < 30; ++i )); do
    dir="/home/application/Files/output/$( date -d "now -$i days" +'%Y/%m/%d' )"
    [ -d "$dir" ] && break
done

if [ ! -d "$dir" ]; then
    echo 'Can not find recent output directory!' >&2
    exit 1
fi

printf 'Using output directory "%s"\n' "$dir"
cd "$dir"

答え3

ディレクトリが常に同じ日または同じ日付に非常に近いように作成される場合、名前は次のようになります。

cd $(find /home/application/Files/output/$(date +%Y)/ -mindepth 1 -maxdepth 1 \
  -mtime -2 -type d |sort -r |head -1)

私はそれをテストしていません。最小/最大深さが2になる必要があるかもしれません。 :)

このソリューションには最大2日の作成日が必要です。たぶんあなたも調整する必要があります。

改行なし:

 cd $(find somepath/$(date +%Y)/ -mindepth 1 -maxdepth 1 -mtime -2 -type d |sort -r |head -1)

関連情報