次の点をご確認ください。
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
-name
find
Delete_Name.txt
awk
$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=
使用しました。-r
while read
次のバージョンは、.txtにリストされているファイルの数に関係なくfind -regex
一度だけ実行されます。このオプションにはGNUまたはFreeBSDのバージョンが必要です。find
/MAC/Delete_Name.txt
find
-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