質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

4回答

3813閲覧

ディレクトリ名 スペース エスケープ

coko1

総合スコア276

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2016/10/04 06:52

編集2016/10/04 07:13

以前に解決してもらった質問にはなるのですが、問題が新たに発生したため解決策を教えていただきたいです。
コマンドライン:↓
find $path -type d | grep -E -v -f list_test.txt | xargs ls -lgG

$path : 検索ディレクトリ
grep : パターンファイルでfind検索時除外するディレクトリ以下の情報指定
パターンファイル記述例 : /aaa/bbb/ccc/ddd/fff (/fff 以下の情報を除外)

表示結果:↓
/aaa/bbb/ccc/ddd/eee:
合計 60
-rwxrwxrwx 1 5424 1月 13 09:51 2016 a_01.txt
-rwxrwxrwx 1 3748 1月 13 09:53 2016 a_02.txt
-rwxrwxrwx 1 4732 2月 13 09:55 2016 a_03.txt
-rwxrwxrwx 1 1323 2月 7 17:05 2016 a_04.txt
-rwxrwxrwx 1 3456 3月 4 16:27 2016 a_05.txt

/aaa/bbb/ccc/ddd/ggg:
合計 12
-rwxrwxrwx 1 638 11月 18 11:40 2015 b_01.txt
-rwxrwxrwx 1 760 11月 26 12:00 2015 b_02.txt
-rwxrwxrwx 1 25 10月 26 11:34 2015 b_02.txt
※表示結果の3列目はサイズですが、桁数が違っても終端を合わせるようになっています。

問題となるのはfindの結果をlsする際にディレクトリ名にスペースが入っているものがスペースごとに別のディレクトリとして取り扱われ、ls: cannot accessエラーとして認識されてしまうことです。以前は表示形式を変えてなんとか対応させたのですが、やはりこの表示形式を保ちたいのです。なんとかならないでしょうか?

変更後コマンド:↓
find $path -printf "%M %2n %10s %TY-%Tm-%Td %TH:%TM %p\n" |grep -E -v -f list_test.txt
表示形式変更時(現在):↓
-rwxrwxrwx 1 8326 2016-12-09 11:25 /aaa/bbb/ccc/ddd/eee/a_01.txt
-rwxrwxrwx 1 3778 2016-09-09 12:32 /aaa/bbb/ccc/ddd/eee/a_02.txt
-rwxrwxrwx 1 15902 2016-09-08 12:42 /aaa/bbb/ccc/ddd/eee/a_03.txt
-rwxrwxrwx 1 1687 2016-01-20 18:13 /aaa/bbb/ccc/ddd/eee/a_04.txt
-rwxrwxrwx 1 1927 2015-12-07 09:58 /aaa/bbb/ccc/ddd/eee/a_05.txt

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

xargsの手前で改行区切りじゃ無くNUL文字区切りにします。

Bash

1find $path -type d | grep -E -v -f list_test.txt | tr '\n' '\0' | xargs -0 ls -lgG

#追記
grep にも-zというNUL区切りオプションがありました。

Bash

1find $path -type d -print0 | grep -z -E -v -f list_test.txt | xargs -0 ls -lgG

コマンドによってNUL区切りオプションが色々なのがわかりにくいですね。

投稿2016/10/04 07:13

編集2016/10/04 07:50
otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coko1

2016/10/04 07:20

出来ました!こんな解決方法があったんですね… 本当にありがとうございます!
guest

0

何か書いている間に解決しちゃったようですけど、一応書いておきますね。

findのオプションに、正規表現で絞り込む「-regex」とか、「ls -l」書式で出力する(ちょっと違うけど)「-ls」などありますが、それらで解決できませんか?

man find

投稿2016/10/04 07:28

katsuko

総合スコア3471

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自分でスペースありのディレクトリ作って試してないので、思いつきの結果オーライな案となりますが、

find $path -type d | grep -E -v -f list_test.txt | xargs ls -lgG

find $path -type d -exec echo \'{}\' \; | grep -E -v -f list_test.txt | xargs ls -lgG

とするのはいかがでしょう?
意図としては、パイプでgrep に渡す前に、シングルクオートで括ってみるという案です。

投稿2016/10/04 07:22

jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

MS Windowsではありませんから、ファイル名やディレクトリ名にスペースやマルチバイト文字を含ませようとするより、もっと建設的な方向に能力を費やした方が良いかと。

投稿2016/10/04 07:09

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coko1

2016/10/04 07:10

含ませるのではなく含まれているのがls時にエラーとなってしまうんです。
Orlofsky

2016/10/04 07:12

ディレクトリ名にスペースを含ませないことで解決されては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問