Скрипт Bash для поиска отсутствующих файлов из имени файла - PullRequest
1 голос
/ 05 октября 2019

У меня есть папка, которая должна содержать 1485 файлов с именами PA0001.png, PA0002.png ... до PA1485.png

Некоторые из них отсутствуют, и я хотел бы написать сценарий оболочкивозможность идентифицировать пропущенные и распечатать их в виде списка в файле .txt (желательно без начальной строки PA и расширения .png, но с ведущими нулями, если есть)

У меня нетПонять, как действовать, хотя, может быть, с помощью awk? Но я все еще довольно нуб ... Любая помощь будет высоко ценится!

Ответы [ 3 ]

4 голосов
/ 05 октября 2019

Вы можете получить список порядкового номера отсутствующих файлов, используя цикл bash

# Redirect output, per answer
exec > file.txt
for ((i=1 ; i<=1485 ; i++)) ; do
   # Convert to 4 digit zero padded
   printf -v id '%04d' $i
   if [ ! -f "PA$id.png" ] ; then
       echo $id
   fi
done
0 голосов
/ 05 октября 2019

Вы можете сделать это точно без единого цикла Bash:

#!/usr/bin/env bash

{
  find . \
  -maxdepth 1 \
  -regextype posix-extended \
  -regex '.*/([[:digit:]]){4}\.png' \
  -printf '%f\n'
  printf '%04d.png\n' {1..1485}
} | sort | uniq --unique

Объединяет список файлов со списком ожидаемых файлов;затем отсортируйте и распечатайте уникальные записи, которые есть только в напечатанном списке ожидаемых, поэтому отсутствуют файлы.

0 голосов
/ 05 октября 2019

Вот небольшой рефакторинг существующего ответа с пояснениями в комментариях.

# Assign each number in the sequence to i; loop until we have done them all
for ((i=1 ; i<=1485 ; i++)) ; do
   # Format the number with padding for the file name part
   printf -v id '%04d' "$i"
   # If a file with this name does not exist,
   if [ ! -f "PA$id.png" ] ; then
       # Print it to standard output
       echo "$id"
   fi
# Redirect the loop's standard output to a file
done >missing.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...