次のガイドラインがあります。
- があるディレクトリ内のすべての
/x/y/z
拡張子を見つけます.jpg
。 - 一致するリストの作成ファイル名、1行に1つずつファイルに
/x/y/file1.txt
。 - 各ファイルの絶対パスを指定する必要があります。
この説明を理解するのに役立ちますか?最初は、次のコマンドを使用しようとしました。
find /x/y/z -name '*.jpg' -exec basename '{}' >> /x/y/file1.txt \;
しかし、最後のコマンド(...絶対パス)を見ると、次のようになります。
find /x/y/z -name '*.jpg' -exec pathname '{}' >> /x/y/file1.txt \;
質問/指示(コマンド)に対する正しい答えは何ですか?
ベストアンサー1
この回答では、説明の2番目のポイントが実際には「ファイル名」ではなく「パス名」を意味すると仮定します。それ以外の場合、3番目のポイントは意味がありません。
デフォルトでは、find
ユーティリティは最上位の検索パスに基づいて見つかったファイルのフルパスを出力します。
指揮中
find /x/y/z -name '*.jpg' -print
...find
パス名を印刷します。たとえば、/x/y/z/foo/bar/baz.jpg
最上位の検索パスがディレクトリの絶対パス名の場合、自動的に見つかったファイルの絶対パス名が出力されます。
一方、使用する場合
find x/y/z -name '*.jpg' -print
/
(最初の部分に欠落している項目があることを確認してください。x/y/z
)これにより、明らかに相対パス名を含む出力が得られます。
Linuxでは、ユーティリティを使用して絶対パス名に変換できますrealpath
。
find x/y/z -name '*.jpg' -exec realpath {} +
これはrealpath
見つかったパス名のバッチを呼び出します。
Linux以外のシステムでは、GNU coreutilsがインストールされている場合はrealpath
同じユーティリティをインストールできます(しかし呼び出すこともできます)。grealpath
man realpath
(または)も参照してくださいman grealpath
。
指示をもう一度読んでくださいfind
。find
この演習は次のように解決することもできます。
printf '%s\n' /x/y/z/*.jpg >/x/y/file1.txt
.jpg
で終わるディレクトリのすべての名前が一覧表示されます/x/y/z
。便利なディレクトリへの絶対パスがない場合は、次を使用します。
realpath x/y/z/*.jpg >/x/y/file1.txt