多くの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
変数を出力するときに「先行ゼロ」も必要ですが、それは重要ではありません。
シェルの変数には、ファイルシステムのファイル名と同様に、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
以下も参照してください。
「奇妙な」文字を含むファイル名の処理にはfind - print0
、xargs -0
およびbash
引用。読んだ man find; man xargs; man bash
。
例えば:
find . -type f -print0 | \
xargs -0 -r bashscript
そして、bashscript
では、
file="$1"
md5sum "$file"
等.