検索と sed は特殊文字を置き換えます。

検索と sed は特殊文字を置き換えます。

Synology NASで多くのファイルの名前を変更する簡単な方法を探しています。見つかり、sed利用可能ですが使用できませんrename

以下を使用して、これらのファイルとフォルダのリストを取得できます。

find . \( -type d -name "@*" -prune \) -o \( -name "**" \) -print

上記のfindステートメントは、Synology bashの「」に置き換えられた「/」文字を含むすべてのファイルを表示します。

変更する必要があるすべての特殊文字は次のとおりです。  / \ : ? ' ’ ´ ’ 

使用されるプラットフォームおよびファイル共有プロトコルに応じて、これらの文字は異なるように見えたり、異なって表示されたり、まったく表示されなかったり、さまざまな種類の問題を引き起こしたりします。以下では、Synology bashでこれらの文字を見つけることができます。 -name "**" -o -name '*\\*' -o -name "*:*" -o -name "*\?*" -o -name "*\'*" -o -name "*´*" -o -name "*`*"

見つかったすべてのファイルとディレクトリでこれらの文字をどのように変更できますか? 「/」文字から始めます。

助けてくれてありがとう!

ゲイリー

答え1

findコマンドが名前を変更したいファイルセットと正確に一致し、名前を「安全な」ファイル名に変更したいとします。ファイル名の正確な文字がわからない場合は、提案のみを提供できますが、ここには2つあります。

  1. 奇妙な文字を削除します。これは、文字をbash置き換えることによって基本的に処理できると仮定します。

     find . -depth \( -type d -name "@*" -prune \) -o \( -name "**" -execdir \
         bash -c 'echo "Processing $PWD"; for f; do echo mv -- "$f" "${f///}"; done' _ {} + \)
    
  2. 既知の文字だけが保持されます。tr保存したい文字セットが含まれていることを確認してください。

     find . -depth \( -type d -name "@*" -prune \) -o \( -name "**" -execdir \
         bash -c 'echo "Processing $PWD"; for f; do echo mv -- "$f" "$(tr -cd '[:alnum:][:punct:][:space:]' <<<"$f")"; done' _ {} + \)
    

どちらの場合も、echoデバッグをアクティブなステートメントに変換するには削除してください。

答え2

for ループを使用する代替方法は次のとおりです。

# Option globstar activates the ** (search recursivelly).
# Option nullglob removes an * when it matches no file/dir.
$ shopt -s globstar nullglob
$ for i in **/*; do
    # if the name of the file matches the pattern
    # perform the `mv` command
    [[ "$(basename "$i")" =~ ^@.*$ ]] && \
      mv -- "$i" "$(echo "$i" | sed -e 's;^@;;' -e 's;/@;/;')"
    [[ "$(basename "$i")" =~ ^**$ ]] && \
      mv -- "$i" "$(echo "$i" | sed 's;;;')"
  done

注:移動/削除コマンドを実行する前にバックアップを作成するのが最善です。

答え3

findコマンドが目的の結果を提供する場合は、sedにパイプし、sedからbashにパイプすることができます(またはbash / ashにパイプする代わりにファイルにリダイレクト)。

find . \( -type d -name "@*" -prune \) -o \( -name "**" \) -print | sed -n 's/\(.*\)\(\)\(.*\)/mv '"'&'"' '"'\1\3'"'/p' | bash
  • find コマンドは、必要なファイルとディレクトリをリストします。
  • sedはすべての行を繰り返し、特殊文字を置き換え/削除し、各行をbash / ash(mv)実行に設定します。

または、sedをファイルにリダイレクトしてファイルをbash / ashすることもできます(bash list_of_files_and_dirs_to_be_renamed)。実際のデータに使用する前に、重要ではないファイル/ディレクトリに対して良いテストを実行してください。

関連情報