web-dev-qa-db-ja.com

bashスクリプトでアラビア語、中国語、ヒンディー語の文字を含む「YouTubeファイル名」を処理する方法は?

多くのYouTube動画をダウンロードして、bashスクリプトを使用して処理したいと考えています。ただし、使用されるファイル名には、あらゆる種類の特殊文字および非ASCII文字が含まれています。

bashスクリプトでこれをどのように処理しますか?

フォルダ内のそのような各ファイルへのシンボリックリンクを作成するとします。

# Write filenames to filelist.txt in parent folder
ls ./* > ../filelist.txt

# Create sym links for all files in filelist.txt
counter=0
while read video_name; 
  do 
  counter=$((counter+1)); 

  ln -s $video_name  link_name_${counter}.mp4

done < ../filelist.txt

上記の機能は、ファイル名に特殊文字が含まれているため機能しません。

次にファイル名の例をいくつか示します。

पेट (Stomach) कम करने के लिए  5 योग आसन-3G4pEY5njYE.mp4
मन शांत करने के लिए करे वृक्षासन योग _ स्वामी रामदेव-sPytQlaxoIg.mp4
वृक्षासन करने का तरीका और फायदे _ Swami Ramdev-A-2d04ON9hA.mp4

ボーナス:
counter変数を出力するときに「先行ゼロ」も必要ですが、それは重要ではありません。

5
mcExchange

シェルの変数には、ファイルシステムのファイル名と同様に、NUL文字以外の任意の文字を含めることができます。したがって、表示のために変更される可能性のあるlsのマングル出力を読み取らない限り、ファイル名を変数に格納しても問題はありません(ls出力は厳密に見るためです)。

編集された質問では、read$IFSのデフォルト値(readの動作の側面を決定する)を使用して、テキストファイルからファイル名を追加で読み取ります。これにより、ファイルから読み取られた行から隣接する空白が取り除かれ、\文字が入力で発生した場合に特別に解釈される可能性があります。また、技術的には、ファイル名には改行文字が含まれる場合があるため、改行で区切られたリスト(テキストファイルの行)として保存すると、使用できる名前の種類が制限されます。

変数の展開も引用する必要があります。スペースを含むファイル名があり、$video値を引用符で囲まないと、シェルはこれらを複数の単語に分割し、これらの単語を(これらをパターンとしてさらにファイル名グロビングを実行した後)ln -sへの個別の引数

ファイル名のリストを生成するためにlsを使用しないでください。また、すべての変数の展開を引用してください。

counter=0

for video in ./*; do
    counter=$(( counter + 1 ))
    ln -s -- "$video" "link_name_$counter.mp4"
done

上記のコードは、現在のディレクトリにシンボリックリンクを生成することに注意してください。これをもう一度実行すると、これらのリンクが取得され、それらのシンボリックリンクへのリンクがさらに作成されます。別のディレクトリにリンクを作成し、ループで使用されるファイル名展開パターンに注意してリンクを回避するか、ループ内のリンクを明示的にテストしてこれらをスキップすることをお勧めします。

counter=0

for video in ./*; do
    [ -L "$video" ] && continue    # skip symbolic links
    counter=$(( counter + 1 ))
    ln -s -- "$video" "link_name_$counter.mp4"
done

4桁のゼロで埋められたカウンターを取得するには、次を使用できます。

printf -v zcounter '%.4d' "$counter"

これにより、再フォーマットされたカウンターがzcounter変数に直接出力されます。次に、その変数を使用してファイル名を生成します。または、次のようにシンボリックリンクの名前を一度に生成することもできます。

counter=0

for video in ./*; do
    [ -L "$video" ] && continue    # skip symbolic links
    counter=$(( counter + 1 ))

    printf -v linkname 'link_name_%.4d.md4' "$counter"
    ln -s -- "$video" "$linkname"
done

以下も参照してください。

7
Kusalananda

「奇妙な」文字を含むファイル名の処理にはfind - print0xargs -0およびbash引用。読んだ man find; man xargs; man bash

例えば:

find . -type f -print0 | \
    xargs -0 -r bashscript

そして、bashscriptでは、

file="$1"
md5sum "$file"

等.

0
waltinator