Переименуйте файлы и папки во всех sub каталогах для удаления символа

У меня есть некоторые файлы и папки, которые были сохранены в Linux на внешнем жестком диске, некоторые из этих файлов и папок содержат символы "::" я хочу удалить эти символы из всех файлов и папок на диске, поскольку я получаю проблемы при попытке просмотреть файлы в окнах.

Я успешно удалил их из одной папки при помощи в терминале -

rename 's/:://' *::*.*

когда в том единственном каталоге, но хотят сделать это для всех файлов и папок на диске, и существует много sub папок.

Что может я добавлять к вышеупомянутой команде, чтобы заставить его работать над всеми sub папками и файлами в sub папках или является там лучшей командой.

Спасибо.

1
задан 9 January 2020 в 04:48

2 ответа

Вы могли попробовать рекурсивный сценарий. Вот что-то вроде того, что работало бы. Это работает над тестовым каталогом, который я просто сделал, который содержит файлы и каталоги, которые содержат файлы, которые называют, как Вы описываете. этот сценарий идет рекурсивно через все дерево каталогов и заменяет любое происшествие:: в любых именах файлов с точкой. Это настраивается для принятия каталога или списка каталогов как аргумент или аргументы, но это также работает над единственным файлом. Не уверенный, что это составляет все необходимые соображения или возможные ошибочные сценарии, хотя, поэтому скорректируйте его для того, в чем Вы нуждаетесь при использовании его.

#!/bin/bash

function rmCols() {

    if [[ ! -e $1 ]]
    then
        usage "$1" 1
    fi

    if [[ -f $1 ]]
    then
        if [[ -w $1 ]]
        then
            rename :: . "$1"
        else
            usage "$1" 2
        fi
    elif [[ -d $1 ]]
    then
        if [[ -w $1 ]]
        then
            for THING in "$1"/*
            do
                if [[ -f $THING ]]
                then
                    rename :: . "$THING"
                elif [[ -d $THING ]]
                then
                    rmCols "$THING"
                fi
            done
        else
            usage "$1" 3
        fi
    else
        usage "$1" 4 
    fi
}

function usage() {
    echo "
Usage: 

    rmCols accepts a variable number of files and/or directories as arguments and will add the
    current date between the filename and the file type extension for all files in all directory 
    argument(s) or for any file argument(s), recursively.

Syntax:

    rmCols dirName_1 [dirName_2] [dirName_3] ......." >&2
    if [[ $2 -eq 1 ]]
    then
        echo "
Error: 

    There is no such file or directory as $1, check your spelling" >&2
        exit 1
    elif [[ $2 -eq 2 ]]
    then
        echo "
Error: 

    You do not have permission to change the file $1" >&2
        exit 2
    elif [[ $2 -eq 3 ]]
    then
        echo "
Error: 

    You do not have permission to change the directory $1" >&2
        exit 3
    elif [[ $2 -eq 4 ]]
    then
        echo "
Error: 

    $1 is something other than a file or directory" >&2
        exit 4
    fi
}

shopt -s nullglob

for item in "$@"
do
    [[ -h $item ]] && continue
    rmCols "$item"
done

exit 0

Это только изменяет имена файлов не имена каталогов, хотя небольшая модификация должна обработать имена каталогов также. Там вероятно инструмент Linux, который сделает это без сценария, хотя, я просто не знаком с ним. Хотя это работает, я уверен, что существует лучшее решение.

0
ответ дан 11 January 2020 в 09:41

Можно использовать find управляйте для поиска файлов и каталогов рекурсивно напр.

find path/to/start/dir/ -depth -name '*::*.*' -exec rename 's/:://' {} +

-depth важно, если Вы переименовываете файлы и каталоги (иначе, команда может "висячая строка" некоторые подобранные файлы путем переименования их содержания каталогов, прежде чем это будет иметь шанс переименовать их). Если Вы только хотите переименовать файлы, то можно добавить -type f и отбрасывание -depth.

Я рекомендую выполнить команду сначала с rename -n удостоверяться, что это делает правильную вещь.

0
ответ дан 11 January 2020 в 09:41

Другие вопросы по тегам:

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