「ls」から「mv」にパイプを作成します。

「ls」から「mv」にパイプを作成します。

コマンドラインから小さなユーティリティを作成しようとしています。現在の作業ディレクトリに最近追加されたファイルを見つけ、引数として指定された名前を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-print0ls

私の仮定の一部が間違っている場合は許してください。私は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'

おすすめ記事