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

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

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

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何が起こっているのかを確認したい場合、または実装がそれをサポートしていない場合は、両方を削除できますが、スクリプトはそれほど強力ではありません。

pathglob(正規表現ではない)を使用して変数を割り当てるときのfile修飾子とmatch。name単一修飾子(%、、、)は最も短い一致または単一一致を表し、二重修飾子(、、、)は最も長い一致または複数の一致を表します#。これはすべてマニュアルページに文書化されていますが、ここに私の解釈と文脈があります。/%%##//bash

  • ${item%/*}%見せる最短glob パターンとの一致は、次から始める必要があります。終わり$item。したがって、a/b/c一致するテキストを削除します。/*a/b
  • ${item##*/}##見せる最長glob パターンとの一致は、次から始める必要があります。スタート$item。したがって、a/b/c一致するテキストを削除します。*/c
  • ${file//[[\]]/}//見せる多くの種類globの代替コンテンツは、次のテキストで置き換える必要があります/。つまり、何も置き換えてはいけません。 globは、「または」を意味する角括弧内の2文字[の合計です。だから我々は最終的に][]ab[cd]ef[ghabcdefgh

おすすめ記事