※ ChatGPTを利用し、要約された質問です(原文:二つのフォルダで一方のみにあるものをリストアップ)
二つのフォルダで一方のみにあるものをリストアップする方法とは?
このQ&Aのポイント
あるパーティションの中にある同じファイル名を持つもののペアを全て探しだして表示する方法を教えていただきました。
具体的な方法として、以下のコマンドを使用します:find /media/usb2 -xdev -type f -printf '%f %p
' | sort | awk '{if($1==A){if(A!=B)print X;print};B=A;A=$1;X=$0}'
このコマンドの詳細解説として、-xdevオプションは他のファイルシステムにあるディレクトリを探索しないために使用されます。また、'%f'は先行するディレクトリを取り除いたファイル名を表示し、'%p'はファイルのパスを表示します。そして、awkコマンドは列のデータを操作するために使用されます。具体的には、$1は1列目のデータを表し、$0は1行全体のデータを表します。
http://okwave.jp/qa/q8786259.html
において、あるパーティションの中にある
同じファイル名を持つもののペアを全て探しだして表示するやり方を質問した時に
次の答えをいただきました。
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}'
マニュアルを見ると
-xdev ほかのファイルシステムにあるディレクトリを探索しない。
(これはなぜ必要なのでしょう?)
%f 先行するディレクトリをすべて取り去ったファイル名 (すなわち、 最後の要素のみ表示)。
%p ファイル名
ということなので、
-printf '%f %p\n' で最終表示結果にも適用されると思われる書式を指定。
sort はただの並べ替え。
awk の部分が一番分かりませんでした。
; は文を並べるための記号のようで、
A!=B は A≠B ということは分かります。
$1 などが
$nには、n列目のデータが入っている。
$0にはすべての列、つまり1行全体のデータが入っている
と書いてあるサイトを見つけましたが、
何をやっているかが分かりません。
awk の部分を解説していただけると大変ありがたいです。
また、このスクリプトはパスに空白が含まれない前提のものでしたので、
パスに空白が含まれていた場合でもきちんと動作するように改良することは可能でしょうか?
さらに、二つのフォルダの中の全ファイルを比較して、
一方のフォルダの中にしか存在しないファイルのみをリストアップする、
ということもやりたくなったのですが、
そのスクリプトもこの応用ですぐに書けるものでしょうか?
どうぞご教授ください。
よろしくお願い致します。
お礼
おかげさまでかなり理解できました。 本当にありがとうございます。 私はふだん表計算ソフトも使わない人間ですので、 どこかのサイトに書いてあった記述を読んだ時に 列と行を混同して考えてしまい スクリプトで何がなされているのかがさっぱり分かりませんでした。 それと、解説していただいた内容を読んで awk を使った所では パイプを通して入力されてくるデータの 一行一行に対して '{ と '} で挟まれている部分の処理を行っているということが分かりました。 ここで、一行一行読み込んで処理しているのは パイプの働きではなく awk の働きなのですね。 awk で print が実行されると その時読み込んでいる行全体が出力されるということも分かりました。 パイプの働きはまだイマイチよく理解できていなかったために、 すぐに判断がつかなかったのですが。 comm というコマンドも今回初めて知り、 とても勉強になりました。 おかげさまで目的の処理もあっという間にバッチリとなされ、 重ね重ねお礼申し上げます。
補足
もしお時間がありましたら、 次の質問も見ていただけると大変ありがたいです。 http://okwave.jp/qa/q8795779.html