左右の四角形を含むディレクトリの名前を変更するには、次のようにします。
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/b
a/b/c
find
-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
何が起こっているのかを確認したい場合、または実装がそれをサポートしていない場合は、両方を削除できますが、スクリプトはそれほど強力ではありません。
path
glob(正規表現ではない)を使用して変数を割り当てるときの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[gh
abcdefgh