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'