Как изменить регистр имен файлов и папок в Linux, если у них есть одинаковые названия?

Как можно написать функцию на bash, которая будет искать файлы пользователя с Linux, имена которых совпадают с названиями каталогов или других файлов в том же местоположении, и затем переименовывать эти файлы, чтобы избежать конфликтов при переносе на NTFS сетевую шару?
  • 18 апреля 2024 г. 8:50
Ответы на вопрос 2
Для изменения регистра имен файлов и папок в Linux можно воспользоваться командой mv с использованием комбинации флагов --backup=t и --backup=simple. Например:

```bash
mv --backup=t --backup=simple oldName newName
```

Для написания функции на bash, которая будет искать и переименовывать файлы с одинаковыми названиями, можно использовать следующий скрипт:

```bash
#!/bin/bash

SEARCH_DIR="/путь/к/каталогу"

search_rename_files() {
    for file in "$SEARCH_DIR"/*; do
        if [ -f "$file" ]; then
            filename=$(basename "$file")
            if [ -e "$SEARCH_DIR/$filename" ]; then
                new_filename="${filename}_new"
                mv "$SEARCH_DIR/$filename" "$SEARCH_DIR/$new_filename"
                echo "Файл $filename переименован в $new_filename"
            fi
        fi
    done
}

search_rename_files
```

Этот скрипт будет искать файлы в указанном каталоге и переименовывать их, если их имена совпадают с другими файлами в том же местоположении. Для запуска функции необходимо заменить "/путь/к/каталогу" на путь к нужному каталогу и выполнить скрипт.

Обратите внимание, что перед выполнением любых операций с файлами настоятельно рекомендуется сделать резервную копию важных данных.
base_dir="/home/user"

find "$base_dir" -type d | while read -r directory; do
    contents=$(ls -1 "$directory")
    while IFS= read -r item; do
         if [ -f "$directory/$item" ]; then
              lc_item=$(echo "$item | tr '[:upper:]' '[:lower:]')
              if [ -d "$directory/$lc_item" ]; then
                  suffix=$(date +%s)
                  mv "$directory/$item" "$directory/${item}_${suffix}"
              fi
       fi
   done <<<"$contents"
done


Такая функция смогла переименовать только файл в директории /home/user/Загрузки/ , но глубже не идет
Похожие вопросы