Sobre seus erros:
find: The relative path '~/program_files/internet/SSH_tunneling/' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
Você tem ~/program_files/internet/SSH_tunneling/
no seu $PATH
. Isso é um literal ~
. Isso não significa seu diretório home . Em vez disso, isso significa o caminho relativo ~/program_files/internet/SSH_tunneling/
, que é SSH_tunneling
dentro de internet
dentro de program_files
dentro do diretório ~
dentro do diretório atual.
-execdir
não gosta de diretórios relativos em $PATH
porque faz chdir()
nos diretórios em que executa os comandos para executar. Por exemplo, se ao descer a árvore de diretórios, find
encontra um arquivo gif
em ./some-dir
que também contém um diretório ~
, e há um ./some-dir/~/program_files/internet/SSH_tunneling/basename
, então ele pode acabar executando aquele basename
.
Você provavelmente tem um:
PATH="~/program_files/internet/SSH_tunneling/"
no seu ~/.bash*
, que deveria ter sido:
PATH=~/program_files/internet/SSH_tunneling/
ou
PATH="$HOME/program_files/internet/SSH_tunneling"
$ find . -regex ".*t\.gif" | xargs basename
basename: extra operand ‘./f10_1t.gif’
xargs
executará basename
com o maior número de argumentos possível. basename
espera no máximo 2 argumentos, o primeiro um caminho, o segundo um padrão. Então seu comando não faz sentido.
Também xargs
, por padrão, espera uma lista separada em branco (espaço, tabulação e possivelmente mais dependendo da localidade e da implementação find
) e nova linha (todos podem ocorrer em nomes de arquivos) na entrada com tratamento especial de aspas, que não é o formato de saída de find
.
find
produzirá algo como:
./path/to/picture from "The End of the World".gif
Qual xargs
entenderá como três argumentos diferentes: ./path/to/picture
, from
, The End of the World.gif
. find
não tem modo de saída no formato esperado por xargs
, aqui:
./path/to/picture\ from\ \"The\ End\ of\ the\ World\".gif
ou
'./path/to/picture from "The End of the World".gif'
Algumas implementações de xargs
suportam uma opção -0
para manipular uma lista delimitada por NUL em vez de em branco / nova linha + aspas um, e algumas implementações find
têm -print0
predicado para gerar nomes de arquivo com esse formato ( naqueles que não o fizerem, você pode usar -exec printf '%szsh
' {} +
).
Então, algo como:
find . -name "*t.gif" -print0 | xargs -r0 -I {} basename {} t.gif
que seria de pouca utilidade para o seu objetivo geral. Em vez disso, você provavelmente quer algo como:
find . -name '*t.gif' -type f -exec sh -c '
for f do
cp "${f%t.gif}.gif" "$f"
done' sh {} +
Ou com %code% :
autoload zmv # if not already in ~/.zshrc
zmv -C '(**/)(*)t.gif(#qD.)' '$1$2.gif'