私は個人プロジェクトのこの段階を始めています。削除したい「1980p」、「webrip」などの用語でいっぱいのビデオファイルのコレクションがたくさんあります。
コマンドラインでPerlの名前変更を使用するのは十分簡単であるか、GUIで名前変更を使用して行うことができますが、欠点は、ディレクトリを変更するか新しいセッションを開始するたびに同じ情報を入力し続けることです。再び。
まず、私はzshを使用しています。 2番目 - ファイル/フォルダ名にスペースがないように、ドット、スペース、ダッシュなどを下線に正常に変換できます。
3番目 - 作業を簡単にするために、すべてのファイル/フォルダ名を小文字に変換しました。
第四 - 私が何か間違っているか、シェルの再帰がヒットまたは欠落する可能性があるので、フォルダごとに実行します。
use strict;
use warnings;
while read i
do
my $i=$(echo $i)
find . -iname "*$i*" rename 's/"$i"//' {} \;
done < /home/terry/.local/bin/Persistent_File_Renamer/persistent_data.txt
「グローバル」警告を送ってください。
これが見つかりましたが、端末は閉じます。
if [ $# != 1 ]; then
echo "Usage: $0 input-file"
exit 1
else
infile=$1
fi
exec 3< /home/terry/.local/bin/Persistent_File_Renamer/persistent_data.txt
until [ $done ]
do
read <&3 myline
if [ $? != 0 ]; then
done=1
continue
fi
# process file data line-by-line
# in here ...
rename 's/"$myline"//' ./"*$myline*"
done
echo "The End"
私は愚かな奴ではありませんが、ここで何をするのかわかりません。再利用可能で編集可能で終わりのリストで終わる限り、私はアプローチを好まない。
ありがとうございます。
ベストアンサー1
Perlが利用可能な場合、zsh
Perlは必要ありませんrename
。同様に強力でより安定していzsh
ます。zmv
autoload -Uz zmv
strings_to_remove=(
${(f)"$(<~/.local/bin/Persistent_File_Renamer/persistent_data.txt)"}
) &&
zmv -n '(**/)(*)' '$1${${(L)2//[. _-]##/_}//(${(~j[|])strings_to_remove})}'
どこ:
${(f)"$(<file)"}
改行でファイルの内容を分割し、ここで配列に割り当てられた空の行を削除します。zmv
パターンに一致するすべてのファイル(**/)(*)
(すべてのレベルの非隠しディレクトリにある非隠しファイル)の名前を2番目の引数のコード拡張(深さ優先)に変更します。${(L)2}
$2
(ここでキャプチャされたファイルのデフォルト名)を小文字に変換します。${var//[. _-]##/_}
_
1つ以上の.
空白-
文字シーケンスを1に置き換えます_
。${(~j[|])array}
j
oins配列の要素ですが、|
withはリテラルではなくワイルドカード演算子として扱われ~
ます。|
|
満足すれば削除-n
(テスト実行)します。
strings_to_remove=(worst bad)
すべての文字列を一度に置き換えるため、というファイル名があればwobadrst.txt
で置き換えられworst_txt
、worst
削除されませんのでご注意ください。あなたの方法でも同様です。
を使用してrename
perlでFile::Rename
UTF-8でエンコードされたファイル名を想定すると、次のことができます。
find . -depth ! -name . -print0 |
LIST=~/.local/bin/Persistent_File_Renamer/persistent_data.txt \
PERL_UNICODE=S rename -n -0 -d '
use vars qw($pattern);
BEGIN {
open LIST, "<", $ENV{LIST} or die "$ENV{LIST}: $!\n";
chomp(my @strings_to_remove = grep {!/^$/} <LIST>);
our $pattern = join "|", map {qr{\Q$_\E}} @strings_to_remove;
}
s/[_ .-]+/_/g;
$_ = lc $_;
s/$pattern//g'
それにもかかわらず、シェル変数の拡張をPerlコードに含めたくないでしょう。これは、コマンド注入の脆弱性になる可能性があるためです。$ENV{LIST}
ここでファイルで行ったように、環境を介してPerlスクリプトにデータを渡すことができます。