Como remover o “./” principal no “find” do unix?

140
find . -type f -print

imprime

./file1
./file2
./file3

Qualquer maneira de fazê-lo imprimir

file1
file2
file3

?

breadjesus
fonte
1
se você usou -exec /path/to/myscript.sh {} no seu find, o -printf '%P\n'não funciona. Em vez disso, eu tenho que fazer o ./prefixo chomping dentro do script:p=${1#"./"}
truthadjustr 21/10
Se você estiver fazendo isso apenas para um único arquivo:f=`find . -name migration`; echo ${f/.\//}
masterxilo 23/01

Respostas:

38

Se eles estiverem apenas no diretório atual

find * -type f -print

É isso que você quer?

Tim Green
fonte
21
Isso perderá arquivos com nomes que começam com um ponto final.
21710 Sean
2
Ruim, dependendo das configurações do shell * podem não ser avaliadas como arquivos / diretórios "ocultos" - aqueles que começam com o ponto (.) Tente executar este comando em seu diretório pessoal e, em seguida, apenas "encontre o tipo f" e veja a diferença .
Ilia K.
35
Uma preocupação mais relevante é que '*' seja avaliado pelo shell. Você efetivamente tem um tipo de situação de injeção de código malicioso. Seria trivial criar um arquivo chamado '--exec rm' e outro chamado 'zzzz;'. Adeus arquivos.
CWF
6
Isso não é seguro. Se um nome de arquivo começar com um traço, ele será tratado como uma opção para encontrar e poderá falhar ou potencialmente causar danos.
Dale Anderson
4
Por que é -printnecessário? Deu o mesmo resultado sem essa bandeira.
precisa saber é o seguinte
239

Encontre apenas arquivos regulares no diretório atual e imprima-os sem o ./prefixo " ":

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

Do homem encontrar, descrição do -printfformato:

% P Nome do arquivo com o nome do argumento da linha de comando sob o qual foi encontrado removido.

Ilia K.
fonte
18
+1 Boa solução se a sua versão do findsuporte -printf(nem todos o fazem).
Todd Owen
2
Como Todd disse, mas mais precisamente: não é o POSIX 7.
Ciro Santilli 16 冠状 病 六四 事件
8
Suportado ou não, é definitivamente mais seguro que a resposta aceita.
Dale Anderson
10
Você pode usar \0em vez de \nse você quer canalizá-lo para xargs -0(por exemplo, em arquivos caso conter espaços em branco), por exemplofind -type f -printf '%P\0' | xargs -0 head
seanf
1
@Quanlong, trabalha em MacOS se você brew install findutils;)
blockloop
58

Use sed

find . | sed "s|^\./||"
Lie Ryan
fonte
2
Esta é a minha solução preferida; é compatível com POSIX (funciona praticamente em qualquer lugar, até em sistemas embarcados), muito curto e dificilmente resultará em comportamento inesperado. Essa deve ser a resposta aceita.
Jody Bruchon
6
Como isso seria combinado find -exec?
Paul Wintz
find -exec sh -c "echo {} | sed 's|^\./||'" \; ou find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb 19/17
12

pode ser mais curto

find * -type f
ghostdog74
fonte
É melhor 2> /dev/nullignorar o erro relatado quando o comando é executado em um diretório vazio.
neevek
2

Outra maneira de remover o ./é usando o seguinte cut:

find -type f | cut -c3-

Mais explicações podem ser encontradas aqui

banjoAtix
fonte
2

Outra maneira de remover o ./

find * -type d -maxdepth 0
Valheru
fonte
Embora esse código possa resolver a questão, incluindo uma explicação de como e por que isso resolve o problema realmente ajudaria a melhorar a qualidade da sua postagem e provavelmente resultará em mais votos positivos. Lembre-se de que você está respondendo à pergunta dos leitores no futuro, não apenas à pessoa que está perguntando agora. Edite sua resposta para adicionar explicações e dar uma indicação de quais limitações e suposições se aplicam.
David Buck
2

Como a -printfopção não está disponível no OSX, findaqui está um comando que funciona na localização do OSX, caso alguém não queira instalar gnu findusando brewetc:

find . -type f -execdir printf '%s\n' {} + 
anubhava
fonte
1
Infelizmente, isso remove todo o caminho de cada arquivo encontrado, incluindo subdiretórios intermediários, e apenas imprime o próprio nome do arquivo.
PLL
1
Você está certo. Esta solução é boa apenas para arquivos no diretório atual. Para arquivos aninhados, precisamos usar:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava