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


12

私は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コマンドにパイプできるか、自己完結型である限り有効です。


それらのファイルの名前で何をしていますか?それらを単に端末にリストしていますか、それとも別のプログラムまたはスクリプトに渡していますか(個別に、またはリストとして)?これを処理する正しい方法は、ファイル名の使用方法によって異なります。
クサラナンダ

アイデアは、マルチモジュールJavaプロジェクトでサードパーティライブラリに関する統計を行うことでした。私はリストを望んでいたし、後にソートとuniqのを作る
рüффп

回答:


19

ls解析する代わりに、代わりに使用する必要がありますfind。次にbasename、各ファイルで実行して、先頭のディレクトリを削除することもできます。

find lib/ -name '*.jar' -exec basename {} \;

この方法は私にも最適です。
рüффп

3
-maxdepthオプションも参照してください。

13

GNU では、すべてのファイルfindに対して実行する必要はありませんbasename。これははるかに高速になります(特にファイルが多数ある場合)。

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

11

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


スペースも問題になりません。
テルドン

これは良いアイデアであり、おそらく最速のオプションになるでしょう。私がどうなるprintf '%s\n' *.jarかの異なるライン上の各ファイルを取得します。
グレアム

または、printf '%s\0' *.jar空白の問題を排除することもできます(ただし、これはQではありません)。
グレアム14

5

ジョシュ・ジョリーが彼の答えで言ったように、あなたはパースするべきではなくls、代わりに彼の答えでアプローチを使ってください。それでも、awkファイル名からパスを削除するソリューションは次のとおりです。lsで使用しないでください。

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

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


1

find進むべき道は、おそらくですが、あなたがあれば、本当に、本当に(そうしない)取り除きたいlib/からls -1、あなたが使用することができますsed

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

0

これを行うには、-max-args(または短いエイリアス-n)パラメーターを指定したxargsを使用します。

ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename

--quoting-style=cファイル名のスペースがxargsを台無しにしないようにするために使用することに注意してください。


私はそれに気づかなかった。ありがとうございました!別のスタックエクスチェンジでこの宝石を見つけました。--quoting-style = cを使用すると、lsの結果に引用符を挿入できます。したがって、結果の完全なコマンドは次のようになります。 `ls --quoting-style = c -1 lib / *。jar | xargsの--max-argsを1 basename`
ヨーニ

-1

クエリを解決する別の方法は、を使用してすべてのファイルをリストすることですls -R。lsコマンドの出力とgrepを組み合わせて、.jarファイルのみをリストします。次のコマンドを使用して、クエリに対して同じことを実行できます。

ls -R lib | grep jar| grep -v jar*

jarファイルを含むサブディレクトリまたは「list-of-jars.txt」などの名前のファイルがある場合、これはひどく失敗します。
ジュール

grep -v jar *は、引用した例のような名前のファイルで結果を除外します。
joshi.mohit86 14

本当。また、目的のすべてのファイルを除外します。今、私は再びそれを見て、私は...あなたが提案するコマンドは、実際にすべての任意の出力を生成するいかなる状況を見ることはできません
ジュール・

いいえ、次のようなファイルを表示し、などのファイルmylib_2.jarを除外しますlist-of-jars.txt
joshi.mohit86

いいえ、そうではありません。試したところです。 find development -name '*.jar' | wc -l-> 70ls -R development | grep jar| grep -v jar*->出力がまったくありません。
ジュール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.