Isso deve funcionar:
find . -type f -name "*.GEOT14246.*" -print0 | \
xargs -0 rename 's/GEOT14246/GEOT15000/'
, pois não há diretórios nomeados *.GEOT14246.*
Uma variante bash usando find pode ser algo como:
while IFS= read -r -d $'${some_variable/find/replace}
' file; do
printf "MV: %-40s => %s\n" "$file" "${file/GEOT14246/GEOT15000}"
mv "$file" "${file/GEOT14246/GEOT15000}"
done < <(find . -type f -name "*.GEOT14246.*" -print0)
| |
+--- this is starting directory +--- This ensures no hiccup
if newline etc. in name
Caminhos relativos, mas cheios, são passados de find - o que você deve ver a partir do
printf
declaração.
O novo nome é compilado usando o bash:
${some_variable//find/replace}
para substituir todo o uso de find
:
chmod +x script_file
Mais aqui . Isso também pode ser uma boa leitura: BashPitfalls , UsingFind .
Leia alguns guias como o BashGuide . Encontre alguns tutoriais on-line, mas geralmente nunca confie neles, pergunte aqui ou no irc.freenode.net #bash.
Você não precisa invocar o script chamando sh
. Isso também chamaria shell Bourne (sh) e não shell Bourne Again (bash). Se você pretende executá-lo com bash; problema bash file
. A extensão .sh
também está fora do lugar.
O que você normalmente faz é tornar o arquivo executável por:
./script_file
e, em seguida, execute-o com:
# Check if argument 1 is a directory, if not exit with error
if ! [[ -d "$1" ]]; then
printf "Usage: %s [PATH]\n" "$(basename "$0")" >&2
exit 1
fi
# OK
path="$1"
while ...
done < <(find "$path" -type f ...)
O shebang cuida de qual ambiente o script deve ser executado.
No seu script, você não usa o nome do caminho passado em nenhum lugar. O script tem
uma "lista de argumentos" a partir de $0
, que é o nome do script, $1
primeiro argumento, $2
segundo, - e assim por diante.
No seu script, você faria algo na direção de:
$ tree
.
└── d1
├── a1
│ ├── a2
│ │ ├── a3
│ │ │ └── foo.GEOT14246.faa
│ │ └── foo.GEOT14246.faa
│ └── foo.GEOT14246.faa
└── b1
├── b2
│ ├── b3
│ │ └── foo.GEOT14246.faa
│ └── foo.GEOT14246.faa
└── foo.GEOT14246.faa
Sua declaração mv
atual moveria todos os arquivos para onde quer que você emitisse o comando - para um arquivo chamado .GEOT14246. : (como na sobrescrita para cada instrução mv
):
Antes da execução do script:
$ tree
.
├── d1
│ ├── a1
│ │ └── a2
│ │ └── a3
│ └── b1
│ └── b2
│ └── b3
└── *.GEOT15000.*
Após a execução do script:
find . -type f -name "*.GEOT14246.*" -print0 | \
xargs -0 rename 's/GEOT14246/GEOT15000/'
Também arquivos / caminhos com espaços ou outras coisas engraçadas tornariam o script ruim e espalharia o caos. Portanto, você deve citar suas variáveis (como "$file"
).