改行のあるファイル名のファイルの作成方法
shell - Add a newline into a filename with `mv` - Unix & Linux Stack Exchange
ここにいくつも紹介されています。
用語についてはシェルスクリプト(Bash)の記号の意味 - Qiitaがとても参考になりました。
Double Quotesを使う方法
ダブルクォーテーションを使うとEnterキーで改行コードが入力できます。
touch "foo
bar"
Command Substitutionを使う方法
printfコマンドで\nで改行させます。
touch "$(printf "foo\nbar")"
touch $(printf "foo\nbar")とするとfooとbarという名前の2つのファイルが作成されます。
touch "$(printf foo\nbar)"とするとfoonbarという名前のファイルが作成されます。
ANSI-C Quotingを使う方法
$'\n'で改行キーが入力できます。
touch
foo$'\n'bar
touch
$'
foo
\n
bar
'
このどちらでもいけます。
改行のあるファイル名の見え方
linuxBean14.04での見え方
pq@linuxBean:~/tmp$ touch foo$'\n'bar
pq@linuxBean:~/tmp$ ls
foo?bar
Xfce Terminalでは改行コードは?になっています。PCManFMではアイコン、コンパクト、サムネイル、詳細、のどのモードでもちゃんと改行されて表示されます。
ファイル名の変更で表示させると改行コードは四角いアイコンで表示されています。
上のどの方法で作成しても同じ結果でした。
これをコピペするとGUIでも改行のあるファイル名を作成できるのですが、キーボードからこの文字を入力する方法はわかりませんでした。
KDE neonでの見え方
pq@NUC8i7BEH:~/_tmp$ touch foo$'\n'bar
pq@NUC8i7BEH:~/_tmp$ ls
'foo'$'\n''bar'
KDE neonのKonsoleではどの方法で作成しても'1行目'$'\n''2行目'という形式で表示されました。
Dolphinではどのモードにしても改行は無視されて表示されました。
名前の変更をしようとすると改行が入っていることがわかります。
Dolphin上で改行のあるファイル名を作成する方法はわかりませんでした。
while..do..doneループで改行のあるファイル名を取り扱う
~/tmpフォルダには改行のある名前をもった2つのファイルが入っています。
findコマンドでこれらのファイルのパスを取得して1行ずつ出力させてみます。
#!/bin/bash
C=0
while IFS= read -r S
do
echo line$((++C)): "${S}"
done < <(find ~/tmp -type f -print)
pq@linuxBean:~$ bash iterate.sh
line1: /home/pq/tmp/foo
line2: bar
line3: /home/pq/tmp/foo2
line4: bar2
改行のところでファイル名が分割されてしまっているのでこの方法はダメです。while文に渡すときにすでに行が分割されてしまっているのでIFS=としてもダメです。
Reading null delimited strings through a Bash loop - BugsDB
while文にnull文字区切りで渡し、readのdオプションでnull文字を指定するとうまくいきました。
#!/bin/bash
C=0
while read -r -d '' S
do
echo line$((++C)): "${S}"
done < <(find ~/tmp -type f -print0)
pq@linuxBean:~$ bash iterate.sh
line1: /home/pq/tmp/foo
bar
line2: /home/pq/tmp/foo2
bar2
これでちゃんと改行文字を含んだファイル名が取得できています。
0 件のコメント:
コメントを投稿