改行のあるファイル名の作成方法とwhile..do..doneループ文での処理

2020-07-24

KDE neonを使おう

t f B! P L

改行のあるファイル名のファイルの作成方法


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\nbar'

このどちらでもいけます。

改行のあるファイル名の見え方


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
これでちゃんと改行文字を含んだファイル名が取得できています。

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ