ファイル名なしでファイルパスを検索して印刷する

ファイル名なしでファイルパスを検索して印刷する

次の点をご確認ください。

awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt | 
    while IFS= read -r file; do find /OS/ -iname "$file.pdf" ; done 

これにより、次のような出力が生成されます。

/OS/001DAY/11file/cooke.pdf

次のようにファイルパスを印刷したいと思います。

/OS/001DAY/11file/

答え1

最適化する方法があります(たとえば、-の内容に基づいて正規表現を作成し、代わりにDelete_Name.txt-を使用するため、1行に1回ではなく1回だけ実行できます)。しかし、明らかなバグは、$fileがそうでないようです。どこでも定義 - 出力を。find -iregex-namefindDelete_Name.txtawk$line$file

たぶん、次のようにしてみてください。

awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt | 
while IFS= read -r file; do 
    find /OS/ -iname "$file.pdf"
done | sed -e 's:[^/]*$/::'

(これはすべて1行にすることができます。読みやすさを高め、このサイトで水平スクロールバーを避けるために複数行に分割しました。)

上記のエラーを修正することに加えて、行全体を一度に読み取り(行にスペースやタブが含まれている場合でも)、行全体を$ fileに割り当てるオプションも設定してIFS=使用しました。-rwhile read

次のバージョンは、.txtにリストされているファイルの数に関係なくfind -regex一度だけ実行されます。このオプションにはGNUまたはFreeBSDのバージョンが必要です。find/MAC/Delete_Name.txtfind-iregex

regexp=$(awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt  | 
         sed -n -e '1,$H; ${ g; s/\n/\\|/g ; s/^\\|//p}')

find /OS/ -iregex ".*\($regexp\)\.pdf$" | sed -e 's:[^/]*$/::'

警告:ファイルが多いと、/MAC/Delete_Name.txt生成された正規表現が大きすぎて単一のコマンドラインに入ることができず、コマンドがfind失敗します。シェル、オペレーティングシステム、およびバージョンによっては、各シェルコマンドラインの制限は数千文字になる可能性があります。

答え2

findを使用すると、簡単にこれを行うことができます-printf。 ~からman find:

  %h     Leading directories of file's name (all but the last ele-
         ment).  If the file name contains no slashes (since it is
         in the current directory) the  %h  specifier  expands  to
         ".".

だから:

awk '/SOURCE/ {print $3}' /MAC/Delete_Name.txt | 
    while IFS= read -r file; do find /OS/ -iname "$file.pdf" -printf "%h\n" ; done 

関連情報