Сопоставление файлов в каталоге и проверка

Параметр INC_APPEND_HISTORY , если установлен, вызывает более немедленную запись записей истории. Также обратите внимание на SHARE_HISTORY , который, если установлен, может привести к тому, что новые оболочки подхватят что-то, что похоже на то, что вы хотите удалить из истории. Перезапись истории в реальном времени зависит от этих параметров, как если бы вы не заботились о других командах в этом конкретном экземпляре оболочки, а INC_APPEND_HISTORY не установлен, просто удалите историю этой оболочки с помощью fc -R :

% echo super secret password
super secret password
% echo whoopsie 
whoopsie
% history -2
18030  echo super secret password
18031  echo whoopsie
% fc -R $HISTFILE
% history -3
36060  vim ~/.zshrc
36061  man readpassphrase
36062  mutt
% 

Затем подтвердите с помощью $ EDITOR $ HISTFILE , что этого суперсекретного пароля нет в файле истории (также! Обратите внимание, что может быть zshaddhistory ] (или массив функций), и в этом случае вам нужно будет проверить, что эта функция (или эти функции) делает (делает)). При использовании INC_APPEND_HISTORY запись, вероятно, находится в $ HISTFILE , поэтому отредактируйте файл истории, чтобы удалить неверную запись, а затем fc -R $ HISTFILE , чтобы удалить ее из как файл истории, так и оболочка. С INC_APPEND_HISTORY и SHARE_HISTORY , и если вы подозреваете, что новые оболочки получили эту неверную запись в истории, вам необходимо выполнить fc -R во всех этих оболочках. или закройте их все, убедитесь, что ни одна из них не записала неверную строку обратно в файл истории и т. д.

1
21.03.2018, 23:05
4 ответа

Первый вариант

Он перебирает все имена файлов и проверяет каждый файл, есть ли у него пара или нет, и выводит соответствующее сообщение.

for i in *; do
    base=${i%.*}
    if [ -e "${base}.out" -a -e "${base}.ctl" ]; then
        printf 'file "%s" has a pair\n' "$i"
    else
        printf 'file "%s" has not a pair\n' "$i"
    fi  
done

Второй вариант

Он перебирает только файлы .ctlи проверяет, есть ли в текущем файле .ctlпара -и файл .out. Таким образом, он печатает только парные файлы, пропуская остальные -непарные файлы.

for i in *.ctl; do
    base=${i%.*}
    if [ -e "${base}.out" ]; then
        printf 'file "%s" has a pair "%s"\n' "$i" "${base}.out"
    fi
done
1
20.08.2021, 11:22
comm <(basename -a -s.ctl *.ctl | sort) <(basename -a -s.out *.out | sort)

См. comm(1), особенно флаги -12будут отображать только файлы с обоими суффиксами.

2
20.08.2021, 11:22

Вы пытаетесь обнаружить отсутствующие файлы.ctl и .out, поэтому вам нужно проверить оба способа. Простой способ сделать это (, если ваши имена файлов не содержат специальных символов, включая пробелы, и содержат только одну точку ), это

  1. найти все файлы с find. -type f,
  2. удалить расширение с каждого из них с помощью cut --delimiter=. --fields=1,
  3. sort --uniqueдля удаления дубликатов,
  4. перебираем их с помощью while read nameи, наконец,
  5. проверьте, существует ли каждый из файлов с [[ -e "${name}.ctl" ]] || echo "${name}.ctl" >&2и то же самое для.out.
0
20.08.2021, 11:22

Вы можете просмотреть файлы и получить ожидаемые имена файлов для файлов вывода и управления. Как только вы это сделаете, вы можете проверить, существуют ли оба:

for item in *.out *.ctl
do
    base="${item%???}"
    out="$base.out" ctl="$base.ctl"
    [ -f "$out" -a ! -f "$ctl" ] && echo "$out is missing $ctl" >&2
    [ -f "$ctl" -a ! -f "$out" ] && echo "$ctl is missing $out" >&2
done
0
20.08.2021, 11:22

Теги

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