`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충분하거나 자체적으로 파이프 할 수 있다면 좋을 것 입니다.


해당 파일 이름으로 무엇을하고 있습니까? 그것들을 터미널에 방금 나열 했습니까, 아니면 다른 프로그램이나 스크립트 (개인 또는 목록)로 전달하고 있습니까? 이를 처리하는 올바른 방법은 파일 이름 사용 방법에 따라 다릅니다.
— Kusalananda

아이디어는 다중 모듈 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)파일 이름에 공백이나 특수 문자가 없다고 가정하면 어떻습니까 ? 부모 스크립트는 디렉토리를 변경하지 않습니다.


공백도 문제가되지 않습니다.
— terdon

이것은 좋은 생각이며 아마도 가장 빠른 옵션 일 것입니다. 그래도 printf '%s\n' *.jar각 파일을 다른 줄에 넣습니다.
— Graeme

또는 printf '%s\0' *.jar공백 문제를 제거하기 위해 (Q가 아니지만).
— Graeme

5

Josh Jolly가 그의 대답에서 말했듯이 구문 분석해서는 안됩니다 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 (또는 더 짧은 alias -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를 망치지 않도록하기 위해 사용 합니다.


나는 그것을 알아 차리지 못했다. 감사합니다! 다른 스택 교환에서이 gem을 찾았습니다. --quoting-style = c를 사용하여 ls 결과에 따옴표를 도입 할 수 있습니다. 결과 전체 명령은 다음과 같습니다.`ls --quoting-style = c -1 lib / *. jar | xargs --max-args 1 기본 이름`
— yoni

-1

쿼리를 해결하는 다른 방법은을 사용하여 모든 파일을 나열하는 것 ls -R입니다. ls 명령의 출력을 grep과 결합하여 .jar 파일 만 나열하십시오. 다음 명령을 사용하여 쿼리에 대해 동일한 작업을 수행 할 수 있습니다.

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

jar 파일을 포함하는 서브 디렉토리 또는 "list-of-jars.txt"와 같은 파일이있는 경우 이는 실패합니다.
— Jules

grep -v jar *는 인용 된 예제와 같은 이름의 파일로 결과를 필터링합니다.
— joshi.mohit86

진실. 또한 의도 한 모든 파일을 필터링합니다. 이제 다시 한 번 살펴보면, 제안한 명령이 실제로 출력을 생성하는 상황은 전혀 없습니다.
— Jules

아니요, 같은 파일을 표시 mylib_2.jar하고 같은 파일 을 필터링합니다 list-of-jars.txt.
— joshi.mohit86

아닙니다. 방금 시도했습니다. find development -name '*.jar' | wc -l-> 70. ls -R development | grep jar| grep -v jar*-> 전혀 출력이 없습니다.
— Jules
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.