избегайте проблем с пробелами и апострофами с помощью ls в сценарии awk

$ nmcli con add type wifi ifname wlps3s0 master bond0 ssid $YOURSSID
1
03.01.2021, 12:54
3 ответа

Да, нет простого способа надежно проанализировать вывод ls.

Здесь вы можете использовать zshвместо:

#! /bin/zsh -
zmodload zsh/stat || exit
typeset -A size_to_name
model_folder=${1?}

for f in $model_folder/*(ND.); do
  stat -LA size +size -- $f &&
    size_to_name[$size]=$f:t &&
    print -r "# File of size $size should be named ${(q)f:t}"
done

for f in *(ND.); do
  stat -LA size +size -- $f &&
    (($+size_to_name[$size])) &&
    [[ $f != $size_to_name[$size] ]] &&
    print -r mv -i -- ${(qq)f} ${(qq)size_to_name[$size]}
done

(для запуска какthat-script /model-folder-path)

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

Передайте на sh, как только вы убедитесь, что это правильно. Обратите внимание, что мы не проверяем случай, когда два файла имеют одинаковый размер. В этом случае будет выбран последний в лексическом порядке (, если aи zоба имеют размер 42 в папке модели _, тогда любой файл размера 42 будет переименован в zв папке модели. текущая папка (, хотя -iдаст вам возможность избежать перезаписи первой второй )).

1
18.03.2021, 22:39

Будет точнее использовать контрольные суммы для идентификации идентичных файлов между двумя каталогами :с bash 4.3+ вы можете сделать

getFiles() {
    local -n _files=$1
    local dir=${2:-.}
    cd "$dir"
    for file in *; do
        [[ -d $file ]] && continue
        read sum name < <(md5sum "$file")
        _files[$sum]="$file"
    done
    cd -
}

declare -A pwdFiles
getFiles pwdFiles

declare -A modelFiles
getFiles modelFiles /model-folder-path

for sum in "${!pwdFiles[@]}"; do
    if [[ -v modelFiles[$sum] ]]; then
        mv -v "${pwdFiles[$sum]}" "${modelFiles[$sum]}"
    fi
done
1
18.03.2021, 22:39

Предполагая, что это будет разовая -операция по исправлению предыдущей ошибки в переименовании, что не так с простым diff, что-то вроде (непроверенного):

for newfile in *; do
    for oldpath in /model-folder-path/*; do
        if ! diff -q "$oldpath" "$newfile" >/dev/null; then
            oldfile=${oldpath##*/}
            if [[ "$oldfile" != "$newfile" ]]; then
                if [[ -f "$oldfile" ]]; then
                    echo "clash on $oldfile" >&2
                    exit 1
                fi
                mv -- "$newfile" "$oldfile"
            fi
        fi
    done
done
0
18.03.2021, 22:39

Теги

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