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/.\//}
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.
+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;)
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|^\./||' <<< '{}'" \;
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:
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' {} +
-exec /path/to/myscript.sh {}
no seufind
, o-printf '%P\n'
não funciona. Em vez disso, eu tenho que fazer o./
prefixo chomping dentro do script:p=${1#"./"}
f=`find . -name migration`; echo ${f/.\//}
Respostas:
Se eles estiverem apenas no diretório atual
find * -type f -print
É isso que você quer?
fonte
-print
necessário? Deu o mesmo resultado sem essa bandeira.Encontre apenas arquivos regulares no diretório atual e imprima-os sem o
./
prefixo " ":Do homem encontrar, descrição do
-printf
formato:fonte
find
suporte-printf
(nem todos o fazem).\0
em vez de\n
se você quer canalizá-lo paraxargs -0
(por exemplo, em arquivos caso conter espaços em branco), por exemplofind -type f -printf '%P\0' | xargs -0 head
brew install findutils
;)Use sed
fonte
find -exec
?find -exec sh -c "echo {} | sed 's|^\./||'" \;
oufind -exec sh -c "sed 's|^\./||' <<< '{}'" \;
pode ser mais curto
fonte
2> /dev/null
ignorar o erro relatado quando o comando é executado em um diretório vazio.Outra maneira de remover o
./
é usando o seguintecut
:Mais explicações podem ser encontradas aqui
fonte
Outra maneira de remover o ./
fonte
Como a
-printf
opção não está disponível no OSX,find
aqui está um comando que funciona na localização do OSX, caso alguém não queira instalargnu find
usandobrew
etc:fonte
find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +