web-dev-qa-db-ja.com

`ls`コマンドからフォルダープレフィックスを削除することは可能ですか

私はbashスクリプトを使用していて、すべてのファイル(すべてのjarファイルと言います)のリストを取得したいと考えています。コマンドls -1 lib/*.jarを実行して、出力を取得します。

lib/mylib_1.jar
lib/mylib_2.jar
...

次の出力を行うオプションはありますか?

mylib_1.jar
mylib_2.jar
...

前にcd libを作成することはオプションではありません。ループ内にあり、ループ内で実行するアクションの親フォルダーに存在する必要があるためです。

man ls」と入力して情報を検索しようとしましたが、解決策は見つかりませんでした。

別のコマンドを使用した解決策は、lsコマンドまたはそれ自体で十分なものにパイプできる限り、良いでしょう。

12
рüффп

GNU findを使用すると、すべてのファイルに対してbasenameを実行する必要がありません。これは非常に高速になります(特にファイルが多い場合):

find lib -name '*.jar' -printf '%P\n'
13
Graeme

(cd lib && echo *.jar)、ファイル名に空白や特殊文字がないと仮定します。親スクリプトがディレクトリを変更することはありません。

11
doneal24

ジョシュジョリーが彼の回答で述べたように、lsを解析してはいけません。代わりに彼の回答でアプローチを使用してください。それでも、ファイル名からパスを削除するawkソリューションがあります。lsでは使用しないでください。

find . | awk -F'/' '{print $NF}'

-F'/'は、フィールドセパレータを/に設定します。これは、最後のフィールド$NFがファイル名になることを意味します。

5
terdon