リストを読むときにファイル名から指定された用語を削除するには?

リストを読むときにファイル名から指定された用語を削除するには?

私は個人プロジェクトのこの段階を始めています。削除したい「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が利用可能な場合、zshPerlは必要ありません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} joins配列の要素ですが、|withはリテラルではなくワイルドカード演算子として扱われ~ます。||

満足すれば削除-n(テスト実行)します。

strings_to_remove=(worst bad)すべての文字列を一度に置き換えるため、というファイル名があればwobadrst.txtで置き換えられworst_txtworst削除されませんのでご注意ください。あなたの方法でも同様です。

を使用してrenameperlでFile::RenameUTF-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スクリプトにデータを渡すことができます。

関連情報