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
度だけ実行されます。cmd
GNU xargs
(も導入済み-0
)には、-r
これを防ぐためのオプション(現在の他の実装でもサポートされています)があります。
今、あなたのアプローチにはいくつかの他の問題があります。
- ファイルの数が多い場合は複数回
xargs
実行されるため、ls -t
最新のファイルをインポートするのではなく、最初のバッチの最新のファイルのみをインポートします。 - これらのファイルのいずれかがその種類であることを意味する
-d
オプションは渡されません。ls
目次、その内容がリストされます。 - 任意のファイル名を処理できる
-print0
/を使用していますが、もはやNULで区切られたファイルのリストを出力しないためにそれを使用すると破損します。xargs -0
ls -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
(おそらく-maxdepth
GNU-mmin
拡張を使用しているでしょう)//sort
実装は入力でNUL文字をサポートします。cut
head
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-