нижний регистр во все файлы в каталоге, ожидающем отменить это в какой-то момент

Хорошо, таким образом, я хочу обработать в пакетном режиме, переименовывают файлы (и файлы в подкаталогах) в каталоге к нижнему регистру, но я также хочу отменить это в какой-то момент. Я должен сохранить их настоящие имена где-нибудь, таким образом, я могу вернуться к исходной структуре, после того как я сделан?

Это может быть сделано в ударе?

2
задан 12 October 2014 в 05:34

3 ответа

да, довольно простой

for f in *; do
    mv "$f" "${f,,}"
    printf "mv %q %q\n" "${f,,}" "$f" >> restore.sh
done

выполненный bash restore.sh восстановить бывшие имена файлов.


Рекурсивный: более хитрый, чем первый появляется: Я закончил тем, что обработал файлы и каталоги отдельно, только переименовав основную часть пути.

declare -A restore=([f]=restore_file.sh [d]=restore_dir.sh)
for type in f d; do
    find . -type $type -print0 | while IFS= read -rd '' path; do
        base=$(basename "$path")
        lower="$(dirname "$path")/${base,,}"
        mv "$path" "$lower"
        printf "mv %q %q\n" "$lower" "$path" >> "${restore[$type]}"
    done
done

Восстановить:

bash restore_dir.sh
bash restore_file.sh
3
ответ дан 6 October 2019 в 23:46

Переименовывание достаточно просто с, немного преобразовывают с rename. Следующее инертно (удалите флаг-n, чтобы заставить его сделать вещи), и оно скажет Вам что это' выполнение:

rename 'tr/A-Z/a-z/' -vn * 

Однако, если Вы хотите встроить это в обратимый сценарий, необходимо сделать немного больше:

rename 'tr/A-Z/a-z/' -vn * | sed 's/ renamed as /#/' | awk -F'#' '{print "mv '\''" $2 "'\'' '\''" $1 "'\''"}' > reverse.sh
<час>

, Если необходимо изменить список файлов, входящих в это (например, рекурсивный), можно или передать имена по каналу в, переименуйте:

find | rename ...

Или использование некоторые опции Bash для globbing рекурсивно:

shopt -s globstar
rename ... ** *
1
ответ дан 6 October 2019 в 23:46
#!/bin/bash

IFS=$'\n'
WORKING_PATH=$(pwd $1)

RESTORE_FILENAME="$WORKING_PATH/restore_case.sh"

echo "#!/bin/bash" > "$RESTORE_FILENAME"
chmod a+x "$RESTORE_FILENAME"


for FILEPATH in $(find . -type f)
do
    FILENAME="${FILEPATH##*/}"
    LOWER_FILE="${FILEPATH::-${#FILENAME}}${FILENAME,,}"

    if [ "$LOWER_FILE" != "$FILEPATH" ]; then
        echo moving "$FILEPATH" to "$LOWER_FILE"
        echo mv \""$LOWER_FILE"\" \""$FILEPATH"\" >> "$RESTORE_FILENAME"_files
        mv "$FILEPATH" "$LOWER_FILE"
    fi
done

touch "$RESTORE_FILENAME"_dirs

for DIRPATH in $(find . -type d -printf "%d%p\n"|sort -nr)
do
    DIRPATH=${DIRPATH:1}
    DIRNAME="${DIRPATH##*/}"
    LOWER_DIRPATH="${DIRPATH::-${#DIRNAME}}${DIRNAME,,}"
    if [ "$LOWER_DIRPATH" != "$DIRPATH" ]; then
        echo moving "$DIRPATH" to "$LOWER_DIRPATH"
        echo -e "mv \""$LOWER_DIRPATH"\" \""$DIRPATH"\"\n$(cat "$RESTORE_FILENAME"_dirs)" > "$RESTORE_FILENAME"_dirs
        mv "$DIRPATH" "$LOWER_DIRPATH"
    fi
done

cat "$RESTORE_FILENAME"_dirs "$RESTORE_FILENAME"_files >> "$RESTORE_FILENAME"
rm "$RESTORE_FILENAME"_dirs "$RESTORE_FILENAME"_files

echo rm '$0' >> "$RESTORE_FILENAME"

дольше, немного грязный, но более точный, также не делает ненужного mv

0
ответ дан 2 December 2019 в 02:24

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

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