ディレクトリから最新のファイルをインポートします。

ディレクトリから最新のファイルをインポートします。

Bashスクリプトでは、次のコマンドを使用して特定のディレクトリから最新のバックアップファイルをインポートします。

find /mnt/synology/bk/ -maxdepth 1 -name 'bk-*' -mmin -60 -print0 | xargs -0 ls -1 -t 2>/dev/null | head -n 1

ファイルが見つからない場合、コマンドは現在のディレクトリ(コマンドが実行されている場所)にあるファイルを返します。

一致するファイルがない場合は空の出力を返すことはできますか?

ありがとう

答え1

xargsの-rオプションを試してください。

-r, --no-run-if-empty
               If the standard input does not contain any nonblanks, do not run the command.  Normally, the command is run once even if there is no input.  This option is a GNU extension.

答え2

一部のBSDを除いて入力が空の場合、引数なしで一xargs cmd度だけ実行されます。cmdGNU xargs(も導入済み-0)には、-rこれを防ぐためのオプション(現在の他の実装でもサポートされています)があります。

今、あなたのアプローチにはいくつかの他の問題があります。

  • ファイルの数が多い場合は複数回xargs実行されるため、ls -t最新のファイルをインポートするのではなく、最初のバッチの最新のファイルのみをインポートします。
  • これらのファイルのいずれかがその種類であることを意味する-dオプションは渡されません。ls目次、その内容がリストされます。
  • 任意のファイル名を処理できる-print0/を使用していますが、もはやNULで区切られたファイルのリストを出力しないためにそれを使用すると破損します。xargs -0ls -t

ここではzsh以下を使用できます。

newest=(/mnt/synology/bk/bk-*(Nmh-1om[1]))
if (($#newest)); then
  printf 'Newest: %s\n' $newest
else
  echo none found
fi

あるいは、GNUを使用しfind(おそらく-maxdepthGNU-mmin拡張を使用しているでしょう)//sort実装は入力でNUL文字をサポートします。cuthead

find /mnt/synology/bk -mindepth 1 -maxdepth 1 \
                      -name 'bk-*' -mmin -60 -printf '%T@/%p\0' |
  tr '\n\0' '\0\n' |
  sort -rn |
  cut -d/ -f2- |
  head -n1 |
  tr '\0' '\n'

(しかし、逆の場合とは異なり、zsh次の部分に有効な文字を形成しないバイトシーケンスが含まれていると、一部のファイルが見つからない可能性がfindあります。)bk-*bk-

関連情報