コマンドラインから小さなユーティリティを作成しようとしています。現在の作業ディレクトリに最近追加されたファイルを見つけ、引数として指定された名前をmv
指定したいと思います。
私はこれでこれを達成しようとしてきました。
ls -tr | tail -n 1 | xargs -0 -J % mv % SQL_warning_2.png
...しかしbashは次のように報告します。
mv: rename Screenshot 2020-06-22 at 17.53.23.png
to SQL_warning_2.png: No such file or directory
私はこれがxargsがfilename:の空白を別の引数として渡すことを意味すると思いますが、私が知っている限りこれにフラグはありませScreenshot 2020-06-22 at 17.53.23.png
ん-print0
。ls
私の仮定の一部が間違っている場合は許してください。私はxargsについて非常に慣れていません。
ベストアンサー1
ファイル名に改行文字が含まれていないと仮定しているようです(次をtail
使用して1つを選択します)。
ls -tr | tail -n 1 | xargs -I % mv -- % SQL_warning_2.png
これによりユーティリティが一度呼び出され-I %
ます。xargs
各ライン%
その行のテキストを読み、置き換えます。代わりに-J %
スペースで行を分けてください。
$ echo 1 2 3 | xargs -J {} printf '"%s"\n' {}
"1"
"2"
"3"
$ echo 1 2 3 | xargs -I {} printf '"%s"\n' {}
"1 2 3"
現在のディレクトリで最後に変更されたファイルの名前を変更したいようです。シェルを使用すると、zsh
次のことができます。
mv -- *(.om[1]) SQL_warning_2.png
mv
最後に変更された一般ファイル名を最初の引数として使用します。om[1]
mtime タイムスタンプに基づいて名前リストを並べ替え、最初の項目を選択する glob 修飾子です。前の点は通常のファイルのみを選択します(ディレクトリなどは選択しません)。
からbash
:
zsh -c 'mv -- *(.om[1]) SQL_warning_2.png'