Как удалить `_` из всех имен файлов в каталоге

найти файлы в текущем каталоге, не в подкаталогах :

find . -maxdepth 1  -type f -name '*.zip'  -exec mv -t "$target/" {} \;

метод исключения архивов :

find . -type f -not -path "$target/*"  -name '*.zip'  -exec mv -t "$target/" {} \;

Обратите внимание, что это исключит только сегодняшний архив, в то время как у вас будут другие архивы, я рекомендую использовать первую команду, или создавать архивные каталоги вне основного каталога!

0
21.02.2018, 00:03
4 ответа

1)for file; dorecorre los parámetros posicionales, es decir, los argumentos de la línea de comandos del script. Use for file in *; dopara recorrer los archivos en el directorio (o _*para tomar solo los que tienen un prefijo de subrayado.)

2 )Puede usar ${file#_}en lugar de ${file//_/}para eliminar el guión bajo al principio del nombre del archivo. ${par#word}elimina específicamente una parte desde el principio, y es una función estándar, a diferencia de ${par/pat/repl}. Y, por supuesto, ${file//_}eliminaría todas las barras diagonales (ya que usó una barra doble -), no solo la primera.

3 )al menos en Linux (GNU userland )y FreeBSD, puede usar mv -npara pedirle que no sobrescriba ningún archivo. Por si acaso.

Entonces,

for file in _*; do
    mv -n -- "$file" "${file#_}"
done
3
28.01.2020, 02:16

Estás terriblemente cerca:

for file in _*; do
    if ! [[ -f "${file/_/}" ]]; then
        mv "$file" "${file/_/}"
    else
        echo "Replacement for '$file' already exists; skipping.." 1>&2
    fi
done

¿Por qué ${file/_/}?Porque especificó un prefijo de subrayado. Entonces _file_name.extse convertirá en file_name.ext. Con ${file//_/}, _file_name.extse convertiría en filename.ext.

0
28.01.2020, 02:16

Simplemente conprename(Renombrar Perl )comando:

prename -n 's/^_//' _*
2
28.01.2020, 02:16

Puedes usar sed

for file in /some/path/*; do
    if [ -f "$file" ]; then
        mv "$file" `echo "$file" | sed 's*_**g'`
    fi
done
0
28.01.2020, 02:16

Теги

Похожие вопросы