左/右の四角形を含むディレクトリの名前を変更する

左/右の四角形を含むディレクトリの名前を変更する

左と右の四角形を含むディレクトリの名前を変更するには、次を使用します。

shopt -s globstar 
rename -n 's/\(|\[|\]|\)//g' **

これにより、現在いるディレクトリ内の [ & ] を含むすべての名前が再帰的に変更されます。

しかし、これを nemo.action スクリプトとして実行する必要があり、動作させることができません。 (基本的には通常のbashスクリプトです)

私の現在のスクリプトは次のとおりです:

#!/bin/bash
shopt -s globstar 

rename  "$@" 's/\(|\[|\]|\)//g' **

どこ$@ですか/media/sf_Mediaserver3/Untitled Folder/[ hdjue] [kskk]

どこ[ hdjue] [kskk] (ランダムな文字のみ)名前を変更したい開始フォルダーと次のファイル/フォルダーです...

もちろん、これは機能しません。親ディレクトリに移動して最初の行を実行する必要がありますが、そうすると、親ディレクトリ内のすべてのディレクトリが処理されてしまいます。誰か、 [ hdjue] [kskk] この問題を解決する方法を知っていますか?

名前変更機能は開始ディレクトリを処理できないようです。

また、可能であれば、すべてのスペースを削除し(.(ドット)に置き換え)、ファイル名/ディレクトリを小文字にして、外部/内部リクエストとの互換性を簡素化します。

答え1

ここでの要件は、私が理解している限りでは、指定されたパスにあるファイルとディレクトリ、および指定されたパスの下のファイルとディレクトリから、[および]文字のすべてのインスタンスを削除することです。

難しいのは、ディレクトリをトラバースしている間に名前の変更を避けることです。globstar は、**深さ優先ではなくルートから下に項目をリストするため、 などの例ではa a/b a/b/c、名前の変更は、 とaへのパスが有効でなくなることを意味します。オプションは でこれを処理できますが、別のアプローチが必要です。a/ba/b/cfind-depth

#!/bin/bash
#
find "$@" -depth -name '*[[\]]*' -print0 |
    while IFS= read -d '' -r item
    do
        path="${item%/*}" file="${item##*/}"    # Separate path and file name parts
        name="${file//[[\]]/}"                  # Generate new file name
        name="${name// /.}"                     # Comment: space becomes dot
        name="${name,,}"                        # Comment: lowercase name

        echo mv -f "$item" "$path/$name"        # Rename
    done

スクリプトが期待どおりに動作することを確認したら、削除echo(または追加) します。

私は、非常に奇妙なファイル名(改行や非表示文字を含むものを含む)のファイルを処理するために、オプション-print0と組み合わせて使用​​しました。何が起こっているのかを確認したい場合、または実装がそれらをサポートしていない場合は、両方を削除できますが、スクリプトの堅牢性が低下します。-d ''read

変数pathfile、を割り当てるときの修飾子はname、グロブ (正規表現ではない) を使用して一致します。単一の修飾子 ( %#/) は最短または単一の一致を意味し、二重の修飾子 ( %%##//) は最長の一致または複数の一致を意味します。これはすべてマニュアル ページに文書化されていますbashが、ここではコンテキストとともに説明します。

  • ${item%/*}%最短グロブパターンに一致するものは削除する必要があります終わりの値です$item。したがって、 については、a/b/cテキストマッチングを削除して/*a/b
  • ${item##*/}##最長グロブパターンに一致するものは削除する必要があります始まりの値です$item。したがって、 については、a/b/cテキストマッチングを削除して*/c
  • ${file//[[\]]/}//複数グロブの置換は、次の に続くテキスト、つまり何もないテキストに置き換えられます/。グロブは、2つの文字と を角括弧で囲んだコレクションで[]「または 」を意味します[]したがって、 の場合は次ab[cd]ef[ghのようになります。abcdefgh

関連情報