コマンドがファイル名のみを印刷する方法はありますかrename
(プレフィックスXXX renamed as
または括弧を除く)?唯一のオプションでない場合は、正規表現を使用しないことをお勧めします。
尋ねる理由: ファイル名が見えないように、何度も連続してファイル名 (実際にはファイルのリスト) を変更したいと思います。最初の名前変更で名前が変更された場合は、2番目の名前変更コマンドに入力できるファイルの新しい名前を取得する簡単な方法がないため、これは困難です。
はい
%20
これにより、Webからダウンロードしたファイルの名前がに変わります。同じパイプラインの後続のコマンドでは、名前をに変更したい場合があります。正規表現が複雑なため(可能であれば)、単一の名前変更コマンドを使用したくありません。
%28
(
find -iname "*%20*" | xargs -n 1 rename --some-option 's/%20/ /g' | xargs -n 1 rename --some-option 's/%28/(/g'
ベストアンサー1
一連のsed
コマンドを使用して、開始ファイル名を最終ファイル名に変換してから実行します。一つ mv
実際の名前変更ファイル:
for i in *%*
do
printf "mv -v '%s' '%s'\n" "$i" \
"$( sed -e 's/%20/ /g' \
-e 's/%28/(/g' \
<<< "$i" )"
done
このコマンドのリストは実際にファイルを変更せず、これは良いことです。mv
実際に必要な操作を実行するために使用できるコマンドを出力するだけです。
%20
以下を含むいくつかのサンプルファイルを作成しましょう%28
。
$ for i in foo bar farkle
> do
> touch $i"%20".txt; touch $i"%28".txt; touch $i"%20-%28".txt
> done
$ ls -1
bar%20-%28.txt
bar%20.txt
bar%28.txt
farkle%20-%28.txt
farkle%20.txt
farkle%28.txt
foo%20-%28.txt
foo%20.txt
foo%28.txt
それでは、最初に提供されたコマンドのリストを実行してみましょう。
$ for i in *%*
> do
> printf "mv -v '%s' '%s'\n" "$i" \
> "$(sed -e 's/%20/ /g' -e 's/%28/(/g' <<< "$i")"
> done
mv -v 'bar%20-%28.txt' 'bar -(.txt'
mv -v 'bar%20.txt' 'bar .txt'
mv -v 'bar%28.txt' 'bar(.txt'
mv -v 'farkle%20-%28.txt' 'farkle -(.txt'
mv -v 'farkle%20.txt' 'farkle .txt'
mv -v 'farkle%28.txt' 'farkle(.txt'
mv -v 'foo%20-%28.txt' 'foo -(.txt'
mv -v 'foo%20.txt' 'foo .txt'
mv -v 'foo%28.txt' 'foo(.txt'
コマンドの順序mv
が正しいと思われる場合は、上矢印を使用してコマンドを再実行してください。ただし、今回はコマンドを表示するのではなく、| sh
実際にコマンドを実行するように最後に追加してください。mv