現在のディレクトリのすべてのファイル名をテキストファイルにリストされている名前に変更します。

現在のディレクトリのすべてのファイル名をテキストファイルにリストされている名前に変更します。

元のタイトルは次のとおりです。vimなどのコマンドシーケンスを使用したvidirの注入

誰かが誤って名前を変更した複数のファイルの名前を変更するためにvidirを使用しようとしました。問題は、vidirがファイルのソート順序を使用せず、時にはランダムに選択することです。私のファイルはめちゃくちゃになり、ls -rtを使って名前を変更する必要がありました。

質問: ファイル名はすべてランダムに変更されます。ただし、ls -rtの順序ですべてのファイル名を含むテキストファイルがあります。そのテキストファイルを使用して名前を読み、ls -rt順序を使用してフォルダ内のファイルの名前を変更したいと思います。

ls -rt出力

cbb308e52a3345e4ff436b2f
a4b8e2aacae0a3304b3c28b8
43ca3253da336012788d3279~
ada694316cc605c7ffb790d1
3b6cc01ff2aaa5b1709918ef
7057cbda90a7adf303a56bb4~
7c0dd50bc52bb444000cc175

Txt_with_Names_In_Order

e0e87002d27674ddafdb5f7077887da6-1.ps
c7685093e84da8074859efc5783687b6-2.ps
062936279f54f4f5a541b5bee4daf5d4-3.ps
6f91bb10840a4a5a5331c832e5c2beb1-4.ps
9a8c5e9ae8b633a2a588518d2b9ab656-5.ps
bcb77709b10eafbd2fc88ce8db41ed3f-6.ps
e65c35be3c8b0aa051fb33ed2ce43ff7-7.ps

解決策:

これでループを実行できますが、vidirがすぐに役に立つと、長いループコマンドを書くことは不可能です。

私のvimコマンドシーケンスには次のものがあります。

^[ggVGg^A some regex
ls -rt | vidir -

上記の方法は機能しますが、対話的に機能する必要があります。

このようなシーケンスを挿入したい

ls -rt | vidir - << EOF
commands
EOF

または

vim file << EOF sequence EOF ------> it works
command | vim - << EOF sequence of vim commands to edit input ELF ----> Want a workaround for this

しかし、入力内容が矛盾するようです。

可能であれば誰でも助けることができます。

[予想を使いたくない]誰でも助けることができますか?

vim exモードのコマンドラインで^ [ggVgg ^ Aを直接使用する方法は?

私がしようとしているのは、いくつかのコマンドの出力をvimにパイプし、そのパイプ入力に対して非対話的に動作するように一連のvimコマンドを挿入することです。

ベストアンサー1

あなたのソリューションの要求は以下に基づいているvimvidir一般的です。XYの問題

あなたの質問を理解したら、実際の要件は、現在のディレクトリの既存のファイル名をテキストファイルの順次名前に変更することですls -rt

次の回避策bashでは、現在のファイル名または保存されているファイル名にスペース、改行、またはその他の問題がある文字が含まれておらず、テキストファイルに1行に1つのファイル名が含まれていると想定しています。

readarray -t new < /path/to/filenames.txt ; \
i=0 ; \
ls -rt1 | while read -r old
do
    echo mv "$old" "${new[$i]}"
    ((i++))
done

上記のスクリプトは、実行するコマンドのみを表示します。出力が要件と一致する場合は、古いechoコンテンツを削除しmvてスクリプトを再実行して、実際にファイル名を変更します。

おすすめ記事