ファイル名クロスプラットフォーム互換性のためのシェルスクリプト

ファイル名クロスプラットフォーム互換性のためのシェルスクリプト

別のプラットフォーム(Linux、MacOS、Windowsなど)に転送するときに問題を引き起こす可能性がある特定のファイル名を特定の置換するために、ファイルマネージャのコンテキストメニューから実行できるシェルスクリプトを作成しようとしています。

これまで、私は初級のスクリプト技術を使って次のような(おそらくかなり汚れた)コードを得ましたが、それでもこれらの文字を置き換える方法を見つけるのに苦労しています。 ''"/(このスマートシングルや他のsed式のように二重引用符とスラッシュを使用すると、ファイルは削除されます!

私が持っているもう1つの問題は、端末に直接入力すると機能しますが、スクリプトがファイル名の前のスペースを削除できないことです。

解決策を見つけるのに役立つことを願っています。

for filename in "${@}"; do
    NEWNAME="$(echo "$filename" | sed -e 's/:/-/g' -e "s/'//g" \
    -e 's/["|?|*]//g' -e 's/[<|>]/ /g' -e 's/\\/ /g' -e 's/\[/ /g' \
    -e 's/\]/ /g' -e 's/\s\s*/ /g' -e 's/^\s\s*//g' -e 's/\s\s*\./\./g')"
    mv "$filename" "$NEWNAME"
done

ベストアンサー1

ただ使用してくださいperl-renamerenameDebianやUbuntuなどで見つかりました)。まず、テスト目的で誤った名前を作成しましょう。

touch "   a truly “horrible”, ‘awful’"$'\n'"name     with a newline and *globs*, and even a 'single' quote or two!   .txt"

次のようになります。

$ ls
'   a truly “horrible”, ‘awful’'$'\n''name     with a newline and *globs*, and even a '\''single'\'' quote or two!   .txt'

改行があることに注意してください。これを繰り返してみると(申し訳ありません)、次のような内容が表示されます。

$ for f in *; do echo "$f"; done
   a truly “horrible”, ‘awful’
name     with a newline and *globs*, and even a 'single' quote or two!   .txt

したがって、この名前には、あなたが直面する問題のすべてではなく、ほとんどが含まれます。今rename悪い文字を削除するには、次を使用します。

$ rename 's/[*“”‘’\n<|>"[\]]//g; s/:/-/g; s/\s+/ /g; s/^\s*//; s/\s+\././g; '"s/'//g" *
$ ls -N
a truly horrible, awfulname with a newline and globs, and even a single quote or two!.txt

ご覧のとおり、これはあなたが探しているすべての悪いことを排除します。 (私が知っている限り、私は続けたいと思うあなたのsedの試みだけがあるので)次のようにスクリプトに入れることができます。

for filename in "${@}"; do
    rename 's/[*“”‘’\n<|>"[\]]//g; 
    s/:/-/g; 
    s/\s+/ /g; 
    s/^\s*//; 
    s/\s+\././g; '"s/'//g" "$filename"
done

説明する

基本的な構文は非常に似ており、sed同じ代替演算子を使用します。正規表現は次のとおりです。

  • s/[*“”‘’\n<|>"[\]]//g;*: 、、 、\n<|>または `] 項目をすべて何もないものに置き換えてから"削除[します。
  • s/:/-/g:空白文字(デフォルトでは空白、タブ、または改行)-
  • s/\s+/ /g:1つ以上の連続した空白文字をすべて1つのスペースに置き換えます。 * s/^\s*//: ファイル名の先頭のすべての先行スペースを削除し、
  • s/\s+\././g:1つ以上の先行スペース文字を削除します.
  • "s/'//g":一重引用符をすべて削除します。完全なコマンドがどのように追加rename '...'されたかを確認してください"s/'//g"。これは、単一引用符で囲まれた文字列内で単一引用符をエスケープできないため、単一引用符で囲まれた文字列を閉じ、文字を処理するために二重引用符で囲まれた新しい文字列を開く必要があるためです'

また、withはファイル名に許可されていない唯一の文字であり、インクルードをまったく生成できない/ため、気にしませんでした。/\0/

おすすめ記事