4

*nix システムで使用できるコマンドライン ツールを使用してクリーンアップしたい一連のファイルがあります。既存のファイルはそのように名前が付けられています。

filecopy2.txt?filename=3
filecopy4.txt?filename=33
filecopy6.txt?filename=198
filecopy8.txt?filename=188
filecopy3.txt?filename=19
filecopy5.txt?filename=1
filecopy7.txt?filename=5555

「?」以降のすべての文字を削除して名前を変更したいと思います。

filecopy2.txt
filecopy4.txt
filecopy6.txt
filecopy8.txt
filecopy3.txt
filecopy5.txt
filecopy7.txt

次の正規表現は、名前から削除したいビットを取得すると信じています。

\?(.*)

これを超えてこのタスクを達成する方法がわかりません。

4

5 に答える 5

3

bash コマンド:

for file in *; do
  mv $file ${file%%\?filename=*}
done
于 2013-06-07T21:01:13.550 に答える
3

すべてのファイルが同じディレクトリにある場合 (を無視.dotfiles):

$ rename -n 's/\?filename=\d+$//' -- *

ディレクトリ階層でファイルの名前を再帰的に変更する場合:

$ find . -type f -exec rename -n 's/\?filename=\d+$//' {} +

-n名前の変更を行うには、オプションを削除します。

于 2013-06-07T21:50:07.463 に答える
1

この場合、cutコマンドを使用できます。

echo 'filecopy2.txt?filename=3' | cut -d? -f1

例:

find . -type f -name "*\?*" -exec sh -c 'mv $1 $(echo $1 | cut -d\? -f1)' mv {}  \;

renameがある場合は、それを使用できます。

rename 's/\?.*$//' *
于 2013-06-07T21:12:51.643 に答える