você pode usar o recurso de expansão de substring bash.
${parameter%%word} Remove matching suffix pattern.
for f in *;do
mv "$f" "${f%% -*}"
done
Eu tenho diretórios:
mas também tenho alguns diretórios com nomes como:
Se o diretório não contiver um hífen deve ser ignorado Se o diretório contiver um hífen: Mkdir Ipsum; mv Ipsum \ - \ * Ipsum
Isso é possível?
Editar para esclarecimento: Se houver um diretório com um hífen, desejo criar um novo nome de diretório com base no hífen da peça e, em seguida, mover TODOS os diretórios que incluam a parte anterior ao hífen nesse novo diretório.
você pode usar o recurso de expansão de substring bash.
${parameter%%word} Remove matching suffix pattern.
for f in *;do
mv "$f" "${f%% -*}"
done
Sim, é possível. Coloque o código como este em um arquivo, digamos fix-dashes.sh (estou no Mac OS, mas isso deve funcionar em outros Unices):
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
trap 'IFS=$SAVEIFS' 0
for i in $@
do
echo Processing $i
case $i in
*-*)
echo "'$i' has a dash"
destname=$(echo "$i" | sed 's/ -.*//')
echo mv "$i" $destname
mv "$i" $destname
;;
esac
done
Em seguida, bash fix-dash.sh */
renomeará os diretórios conforme você especificou. A barra é importante para que você obtenha apenas nomes de diretórios, caso contrário, arquivos regulares com traços serão afetados.
'O IFS contém os delimitadores para as palavras e os nomes dos arquivos têm espaços que você precisa ajustar.
Gosto de usar o mecanismo de expressão regular limitado de case
porque ele simula os REs usados por bash
na linha de comando. Nesse caso, somente nomes contendo traços farão com que a renomeação seja executada.
O comando sed
faz a transformação, neste caso, substituindo tudo após o primeiro com a string nula.