OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

sed により ~/ の左を全て切り取る

  • すぐに回答を!
  • 質問No.8786259
  • 閲覧数115
  • ありがとう数10
  • 気になる数1
  • 回答数3
  • コメント数0

あるパーティションの中にある
同じファイル名を持つもののペアを全て探しだして表示する、
ということを Linux でやりたいです。

たとえば /media/usb2 でマウントされているパーティションなら
ls -R /media/usb2 > allfiles.txt
をまず実行して、
これで生成された allfiles.txt の中に書いてある
/dir_1/dir_2/dir_3/filename
などといったひとつひとつの行の
最後の / の後の filename を使って
find /media/usb2 -name filename
というコマンドを全ての行の filename に対して自動的に実行して
結果をファイルに書き出すスクリプトを作ればいいのでしょうが、
やり方が分かりません。

おそらくは sed を使って
/dir_1/dir_2/dir_3/filename
の最後の / より左を全部切り取り
filename を臨時変数 temp などに格納して
grep $temp allfiles.txt >> result.txt
という操作をカウンタ変数を用いながら
allfiles.txt のほとんど全ての行に対してやればよいと思います。
sed について検索した結果をざっと目を通しても分かりませんでした。
やり方をどなたかご教授下さい。
よろしくお願いいたします。

これは
http://okwave.jp/qa/q8785387.html
で質問したことですが、
ログアウトの仕方がすぐに分からなかったので
ログアウトせずにブラウザを閉じ、OSをシャットダウンする、
ということを何回かやったことが原因だと思いますが、
アカウントがおかしな状態になっていました。
夜にログインして質問を投稿しても
翌朝見ると質問が掲載されていないので、
質問を再度投稿しても即座に掲載されない
というようなおかしな状態になり、
また何度も投稿しようとしたため
ほとんど同じ質問が3つ並ぶ結果となってしまいました。
回答がつきにくいかと思い、再質問しました次第です。
通報する
  • 回答数3
  • 気になる1
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル14

ベストアンサー率 49% (4157/8424)

さっき、回答しようとしたら、締め切られてた。

パスに空白が含まれない前提で、

find /media/usb2 -xdev -type f -printf '%f %p\n' | sort | awk '{if($1==A){if(A!=B)print X;print};B=A;A=$1;X=$0}'

"ファイル名 フルパス" の一覧作って、ソートして、ファイル名が重複する物だけを出力
お礼コメント
noname#214079

ありがとうございます。
投稿日時 - 2014-10-12 03:02:18
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル14

ベストアンサー率 23% (3656/15479)

単純に「最後の / より前を全部消す」だけなら sed -e 's/.*\//' でいけるはず. まあもっといろいろ駆使すればパイプライン 1本でいけそうな気もするけど.
単純に「最後の / より前を全部消す」だけなら
sed -e 's/.*\//'
でいけるはず.

まあもっといろいろ駆使すればパイプライン 1本でいけそうな気もするけど.
  • 回答No.2
レベル13

ベストアンサー率 55% (492/894)

あと、別解としてはbasenameとありますね。shellの組み込み関数として無いとしたら、一つ一つbasenameをfork execするより#1の回答で出ている方が速そうですが。 あと、#1の回答は/が一つ足りないような気がします。sed -e 's/.*\///' /を区切りに使うのはパス名と紛らわしいのでsed -e 's|.*/||'でもいいような気もし ...続きを読む
あと、別解としてはbasenameとありますね。shellの組み込み関数として無いとしたら、一つ一つbasenameをfork execするより#1の回答で出ている方が速そうですが。

あと、#1の回答は/が一つ足りないような気がします。sed -e 's/.*\///'
/を区切りに使うのはパス名と紛らわしいのでsed -e 's|.*/||'でもいいような気もしますが...
自分だったら、sedした後にsort & uniqかけますが。

grepについては、-fを知っておくと何かと便利ですよ。
find /media/usb2 | grep -f allfiles.txt
お礼コメント
noname#214079

ありがとうございます。
投稿日時 - 2014-10-12 03:02:13
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ