Linuxで特定のパーティション内の同じファイル名のペアを探し出す方法

このQ&Aのポイント
  • Linuxで特定のパーティション内の同じファイル名のペアを探し出す方法について教えてください。
  • 具体的には、特定のパーティションにマウントされているファイル内の同じファイル名を持つペアを見つけたいです。
  • lsコマンドとfindコマンドを組み合わせて使用する方法が分からず困っています。どなたか解決策を教えてください。
回答を見る
  • ベストアンサー

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

あるパーティションの中にある 同じファイル名を持つもののペアを全て探しだして表示する、 ということを 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つ並ぶ結果となってしまいました。 回答がつきにくいかと思い、再質問しました次第です。

noname#214079
noname#214079

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4843/10252)
回答No.3

さっき、回答しようとしたら、締め切られてた。 パスに空白が含まれない前提で、 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
質問者

お礼

ありがとうございます。

その他の回答 (2)

回答No.2

あと、別解としては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
質問者

お礼

ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

関連するQ&A

  • cshのsed

    ヤマトです。 cshのsedについて質問します。 環境はRed Had Linux7.2です。 文字列置換でsedを使っています。 置換文字列に'/'が入ってしまう場合正常に動作しません。 原因は分かります。'/'が多いって事ですよね(曖昧な言い方ですみません) どのようにしたら、できるでしょうか? 以下に、サンプルを書きます。 ====SAMPLE.sh(一部抜粋)==== set DATA_DIR = /home/hoge set FILE_NAME = hoge.txt sed "s/__DIR__/$DATA_DIR/g" < FILE_NAME > FILE_NAME.sed ====hoge.txt==== 置換した ディレクトリは __DIR__/です ====hoge.txt.sed(作成したいファイル)==== 置換した ディレクトリは /home/hoge/です どのようにsedしたら良いのでしょうか? 教えて頂けると有り難く思います。宜しくお願いします。

  • sedを使って複数ファイルの先頭行を表示

    以下の様なファイルがあります。 各ファイルの先頭行をとりだしたいのですが、headコマンドを使うと ファイル名と結果が分かれて表示されます。 sedで、-nオプションの行番号指定で表示することができるので、 sed -n '1p' *.txt のワイルドカード指定でやったのですが、 この場合だと複数ファイルとみてくれなくて、すべてのファイルを ひとつにしてその先頭を表示しているみたいです。 できれば、各ファイル毎に、ファイル名と結果を1行にして表示したい のですが、どうすればよいでしょうか。 参照ファイル cat 1.txt 12345 67890 cat 2.txt abcde fghij cat 3.txt 11111 22222 headコマンドで実行 $ head -n 1 *.txt ==> 1.txt <== 12345 ==> 2.txt <== abcde ==> 3.txt <== 11111 sedで実行 $ sed -n '1p' *.txt 12345

  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • sedなんですが…

    perlのことでなくて済みません、が、sedのこととも共通している のではないかと思い、質問させていただきます。 WindowsNT4.0で、アスキーのMS-DOS SoftwareToolsに入っていた sedを今まで使っていましたが、長いファイル名が使えないので sed32に切り替えようとしていますが、エスケープ文字を判断し てくれないようで困っています。 以下に実行例を示します。 C:\TEMP\call>sed32 -V GNU sed version 3.02 + multi-byte extension 1.07 Copyright (C) 1998 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. C:\TEMP\call>sed32.exe -e"s/\t/TAB/g" e2.txt > e2.out e2.txtの内容 ------------------------------------------- select SWK_DENDATE "計上日付", SWK_DENNO "伝票番号", SWK_MCN_CODE "資産code", '' "資産名", nvl(SWK_GYOTEK, SWK_TEK) "摘要", ------------------------------------------- e2.outの内容 ------------------------------------------- selecTAB SWK_DENDATE "計上日付", SWK_DENNO "伝票番号", SWK_MCN_CODE "資産code", '' "資産名", nvl(SWK_GYOTEK, SWK_TEK) "摘要", ------------------------------------------- タブを"TAB"に置換せずに、"select"の"t"が"TAB"に置換されています。 しばらくこの手のtoolを使っていなかったので、よく分からない のですが、どこか使い方が間違っているのでしょうか? それとも、GNU sedの仕様なのでしょうか? SoftwareToolsでは問題ありませんでした。

    • ベストアンサー
    • Perl
  • linuxのsedコマンド変数置換の質問です

    はじめまして。 要点だけになってしまいますが 教えていただきたいことがあってトピしました。 この構文では動きませんが僕がやりたいことは こういうイメージです。 111.txt 444 444 1.txt 111 222 333 444 a=`cat 111` echo $a 結果 444 444 1.txt | sed 's/222/$a/g'          ↑ ↑     置換対象 変数 word を $a に収まっている文字列で置換します。 結果 111 444 444 333 444 どなたかわかるかた教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • sedコマンドでのエスケープ文字の扱い

    はじめまして。Linuxのsedコマンドで困っています。 sedの置換文字列として連続する\をリテラルとする処理を考えていますが、\がいくつ入ってくるか(変数)、わからない場合において、複雑な処理なしに対処できないか、考えています。 ↓簡単な例ですが、コマンドベースで説明すると以下のようなものです。 $ var='\\' $ cat file.txt aa $ sed "s/.*/$var/" file.txt \ という結果になりますが、置換文字を変数から取る際に、連続する\が設定されるケースを想定したプログラムを組むたいと思っています。 \が入ってくる個数がわかるのであれば、\を2倍にセットしておけばできそうですが、いくつセットされてくるかはわからない場合、何かよい方法はないでしょうか。 念のため、Linux環境で、GNU sed 4.1.2版で試行しています。シェルはbashです。よろしくお願いします。

  • sedで特定文字が出たら次の行は読み飛ばす

    Linuxのsedコマンドなのですが、特定文字列が出たら読み飛ばすという事をやっています。 例えば、'#SKIP'が出たら次の行(複数行)は読み飛ばすみたいな事をです。 行飛ばしで2点質問がありますのでお願いします。 以下の様なファイルがあります。 /---------- $ cat input.txt YYYY YYYY YYYY YYYY YYYY #SKIP YYYY YYYY YYYY YYYY YYYY -----------/ '#SKIP'が出たら次の行を読み飛ばすは、 $ sed '/#SKIP/{N; s/YYYY/2016/g}' input.txt YYYY YYYY YYYY YYYY YYYY #SKIP 2016 YYYY YYYY YYYY YYYY と、'#SKIP'の下の行が置換されます。 数行読み飛ばす場合は $ sed '/#SKIP/{N;N;N; s/YYYY/2016/g}' input.txt YYYY YYYY YYYY YYYY YYYY #SKIP 2016 2016 2016 YYYY YYYY と、'#SKIP'から下の3行が置換されます。 てっきり、'#SKIP'から指定した(N;)行分読み飛ばし、それ以降を置換すると 思っていたのですが違うのでしょうか。 使い方が間違っているのでしょうか。 また、同じ様な行飛ばしで、範囲指定した場合ですが、 $ sed -e '3,20n;n;n; s/YYYY/2016/g' input.txt や $ sed -e '3,20{n;n;n; s/YYYY/2016/g}' input.txt とした場合、範囲指定外の3~20以外でも置換されます。 3行目から置換されたり、20行目を越えても置換されます。 OS、バージョンによるものでしょか。 本記載の2点について教えて下さい。

  • ファイル中の数行を抜き出す処理について(シェル)

    ファイルaaa.txtの2行目から4行目を抜き出し、 ファイルbbb.txtに格納する方法として、 sed -n '2,4p' aaa.txt > bbb.txt がありますが、 変数を使用し、 start=2 end=4 sed -n '${start},${end}p' aaa.txt > bbb.txt とすると、エラーが発生します。 どうすればよろしいのでしょうか。

  • sedコマンドの置換パターン条件について

    シェルスクリプトについて質問です。 /etc/ssh/sshd_configのAllowUsers行にユーザを追加&削除、sshdをリスタートするスクリプトを作っています。 ユーザ追加の処理はsedコマンドで実現できました。 sed -i -e "s/^AllowUsers/AllowUsers $USERNAME/" $CONF_FILE そして、悩んでいるのがユーザ削除時の処理です。 "AllowUsersで始まる行の中で" 且つ "変数$USERNAME" に一致する部分を削除するという処理です。sedは複数条件を指定することもできますが、以下記述の場合、2つの条件が独立して処理されてしまいます。 sed -e "s/^AllowUsers/AllowUsers/" -e "s/ $USERNAME//" $CONF_FILE ($USERNAMEに一致する部分はAllowUsersで始まらない行でも置換される) sedにAND条件のような使い方は可能でしょうか。 環境はCentOS 5.3、シェルはbashを使っています。 よろしくお願いいたします。

  • grep,sedコマンドについて

    昨日に引き続き、またまた質問です。 昨日回答してくださった方、ありがとうございました。 その後自分でも色々勉強しまして、ファイルの中身を処理するにはgrepコマンドとsedコマンドが 有効である事が分かりました。 今回やりたいことは以下のファイルの数字と時間の部分(//のついている2行)の削除です //1 //00:00:03,600 --> 00:00:07,195 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx //2 //00:00:07,360 --> 00:00:09,635 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx     ・     ・ (実際のファイルには"//"はついていません) 理想の出力 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx (xxxxxの部分には英語の台詞が入ります) で、以下が自分が考えた方法です 1.sedコマンドのみで削除 $ sed "/[0-9]*\n[0-9][0-9].*/d" ファイル名 結果 ファイルの内容がすべて表示されるだけ (a) 2.grepコマンドで抽出しパイプ処理 まずgrepで削除部分を抽出 $ grep -P "^[0-9]*\n[0-9][0-9].*" ファイル名 結果 1    00:00:03,600 --> 00:00:07,195    2    00:00:07,360 --> 00:00:09,635         ・         ・    10    11         ・         ・ となり、1~9までの数字と時間はちゃんと表示され 10以降は数字しか出ません。 (b) また -P の部分を -E にすると、何も表示されません (c) (perlの正規表現と拡張正規表現の違いはここでは無いように思えますが・・・) 2は最初でつまづいたのでどのコマンドに渡して行を削除するかはまだ分かりません (d) 削除の際、2行まとめて行うのは、一行ずつ行うと、台詞の部分に数字のみが入っていた場合 削除されるのを防ぐためです 以上長くなりましたが(a)~(d)の質問、疑問に回答していただけると嬉しいです。 よろしくお願いします。