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

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実際には重要ではありません。

ベストアンサー1

シェルの変数には、ファイルシステムのファイル名と同様に、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

上記のコードは現在のディレクトリにシンボリックリンクを生成します。このコマンドを2番目に実行すると、これらのリンクが選択され、これらのシンボリックリンクへの追加リンクが生成されます。別のディレクトリにリンクを作成したり、リンクを回避するためにループで使用されるファイル名のグロービングパターンに注意を払ったり、ループ内のリンクを明示的にテストしてスキップしたりすることをお勧めします。

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

また見なさい:

おすすめ記事