ファイル名から「?」(「?」を含む)の後のすべての文字を削除するには?

ファイル名から「?」(「?」を含む)の後のすべての文字を削除するには?

複数のファイルをダウンロードして削除するファイル名に、認証パラメータのように見えるものを追加しました。例:

file1.doc?b1h2uj3b123uiyb12
file2.xls?oi12jo3ij123oij
file3.jpg?0990xcizx0cxzczixuchbiasdu

ファイル全体のフォルダから疑問符の後ろのすべての項目を削除する簡単な方法はありますか?

答え1

すべてのファイル名を疑問符と一致させ、を使用して*\?*変数から次の部分を削除できます。疑問符自体はワイルドカード文字なので、どちらの場合もエスケープする必要があります。?${var%%\?*}

ファイルの簡単なループを実行して実行すると、mvトリックを実行できます。

for f in ./*\?*; do
    echo mv -n "$f" "${f%%\?*}"
done

echo変更する前に実行する操作を確認できるように存在します。出力が合理的に見える場合は削除してください。)

答え2

Perlユーティリティの使用rename:

$ rename -v -n 's/[?].*//' *[?]*
rename(file1.doc?b1h2uj3b123uiyb12, file1.doc)
rename(file2.xls?oi12jo3ij123oij, file2.xls)
rename(file3.jpg?0990xcizx0cxzczixuchbiasdu, file3.jpg)

s/[?].*//これにより、各名前にPerl置換が適用されます。最初の疑問符の前の名前が切り捨てられます。ファイル名*[?]*ワイルドカードパターンは、疑問符を含む現在のディレクトリのすべての名前に拡張されます。

-n実際にファイル名を変更せずにコマンドを実行してください。

関連情報