유닉스 "찾기"에서 선행 "./"를 제거하는 방법?


140
find . -type f -print

인쇄

./file1
./file2
./file3

인쇄 할 수있는 방법

file1
file2
file3

?


1
당신이 사용하는 경우 -exec /path/to/myscript.sh {} 당신에 find의는 -printf '%P\n'작동하지 않습니다. 대신, ./스크립트 에서 접두사 접두사 를 다음과 같이 수행해야합니다 .p=${1#"./"}
truthadjustr

단일 파일에 대해서만 수행하는 경우 :f=`find . -name migration`; echo ${f/.\//}
masterxilo

답변:


38

현재 디렉토리에만있는 경우

find * -type f -print

너가 원하는게 그거야?


21
마침표로 시작하는 이름을 가진 파일이 누락됩니다.
Sean

2
쉘 설정에 따라 나쁘다 * 파일 / 디렉토리를 "숨겨진"것으로 평가하지 않을 수있다-점 (.)으로 시작하는 것 .
Ilia K.

35
보다 관련성이 높은 것은 '*'가 쉘에 의해 평가된다는 것입니다. 효과적으로 악성 코드 삽입 상황이 있습니다. '--exec rm'이라는 이름의 파일과 'zzzz;'라는 이름의 파일을 작성하는 것은 쉽지 않습니다. 안녕히 계세요.
CWF

6
안전하지 않습니다. 파일 이름이 대시로 시작하면 파일을 찾기위한 옵션으로 취급되어 실패하거나 손상 될 수 있습니다.
데일 앤더슨

4
-print필요한가요? 해당 플래그없이 동일한 결과를 얻었습니다.
user13107

239

현재 디렉토리에서 일반 파일 만 찾아서 " ./"접두사 없이 인쇄하십시오 .

find -type f -printf '%P\n'

사람 찾기에서 -printf형식에 대한 설명 :

% P 파일 이름은 발견 된 명령 행 인수의 이름으로 제거됩니다.


18
find지원 버전이 전부인 경우 +1 좋은 솔루션 -printf입니다.
Todd Owen

2
Todd가 말했듯이 더 정확하게는 POSIX 7이 아닙니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

8
지원 여부에 따라 허용되는 답변보다 확실히 안전합니다.
데일 앤더슨

10
예를 들어\0\nxargs -0find -type f -printf '%P\0' | xargs -0 head
seanf

1
@Quanlong, 그것은 macOS에서 작동합니다 brew install findutils;)
blockloop

58

sed 사용

find . | sed "s|^\./||"

2
이것이 내가 선호하는 솔루션입니다. POSIX 호환 (실제로, 심지어는 임베디드 시스템에서도 작동)이며 매우 짧으며 예기치 않은 동작이 발생하지 않습니다. 이것이 정답입니다.
Jody Bruchon

6
이것은 어떻게 결합 find -exec됩니까?
Paul Wintz

find -exec sh -c "echo {} | sed 's|^\./||'" \; 또는 find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb

12

더 짧을 수 있습니다

find * -type f

더 나은 2> /dev/null명령이 빈 디렉토리에 실행할 때 오류를 무시하는 보도했다.
neevek


2

./를 벗기는 또 다른 방법

find * -type d -maxdepth 0

이 코드가 문제를 해결하는 방법과 이유에 대한 설명포함 하여 질문을 해결할 수는 있지만 게시물의 품질을 향상시키는 데 도움이되고 더 많은 투표를 할 수 있습니다. 지금 질문하는 사람이 아니라 독자들에게 질문에 대답하고 있음을 기억하십시오. 설명을 추가하고 어떤 제한 및 가정이 적용되는지 표시하려면 답을 편집하십시오.
David Buck

2

이후 -printf옵션은 OSX에서 사용할 수없는 find누군가가 여기 설치하지 않을 경우 OSX에 작품이 단지의 경우, 찾을 수있는 한 가지 명령으로 gnu find사용하는 brew등 :

find . -type f -execdir printf '%s\n' {} + 

1
불행히도 이것은 중간 하위 디렉토리를 포함하여 찾은 각 파일의 전체 경로를 제거하고 파일 이름 자체를 인쇄합니다.
PLL

1
네 말이 맞아 이 솔루션은 현재 디렉토리의 파일에만 유용합니다. 중첩 된 파일의 경우 다음을 사용해야합니다.find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.