Сценарий передачи

Использованиеsort:

$ ls -lghFG | sort -n -td -k2
total 0
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d1
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d2
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d3
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d4
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d5
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d6
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d7
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d8
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d9
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d10
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d11
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d12
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d13
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d14
-rw-r--r-- 1 0 Aug  3 09:43 tig_10.d15

Это будет использовать букву dв качестве разделителя и сортировать вывод в числовом виде в поле 2, поэтому могут возникнуть проблемы, если ваши имена файлов содержат букву d.

Чтобы удовлетворить ваше требование использовать ll(, который является псевдонимом ), вы можете сделать (не рекомендуется:

alias ll='ls -lghFG | sort -n -td -k2'
0
29.07.2020, 11:30
2 ответа

Всего несколько изменений в том, что у вас было. Основные изменения заключаются в использовании подстановки для поиска файлов и расширении параметров для выделения частей путей к файлам и расширений. Включите опцию nullglob, чтобы значение FOUND _FILE было нулевым, если совпадений нет. Поскольку вы знаете, что готовый файл существует из-за совпадения в цикле for, вы можете проверить, есть ли соответствующий PDF-файл. Если это так, проверьте, не существует ли файл pdf или готовый файл в вашем целевом каталоге. Используйте временную метку эпохи в качестве суффикса файла при наличии конфликта. Это не идеально, потому что все еще существует небольшая вероятность того, что новое имя файла существует. Вы могли бы проверить еще раз, если это было реальной проблемой.

#!/bin/bash

# source directory where all files are
SOURCE_DIR=/var/xms/batch/PDF

# Name of directory you want to move the PDFs to.
DEST_DIR=/var/xms/batch/PDF/put_ready

# Create the destination directory for the moved PDFs, if it doesn't already exist.
[ ! -d "$DEST_DIR" ] && mkdir -p "$DEST_DIR"

# Enable nullglob in the event of no matches
shopt -s nullglob

# Search for.done files starting in $SOURCE_DIR
for FOUND_FILE in "$SOURCE_DIR"/*.done
do
  # Get root file path without extension
  FILE_ROOT="${FOUND_FILE%%.*}"

  # Is there a.pdf to go with the.done file
  if [ -f "${FILE_ROOT}.pdf" ]
  then
      # Do either of these files exist in the DEST_DIR
      if [ -f "$DEST_DIR/${FILE_ROOT##*/}.pdf" ] || [ -f "$DEST_DIR/${FILE_ROOT##*/}.done" ]
      then
          # Use epoch stamp as unique suffix
          FILE_SFX="$(date +%s)"

          ## You could still have a file conflict is the DEST_DIR and
          ## maybe you consider checking first or modifying the move command

          # Move the file pairs and add the new suffix
          mv "${FILE_ROOT}.done" "$DEST_DIR/${FILE_ROOT##*/}_${FILE_SFX}.done"
          mv "${FILE_ROOT}.pdf"  "$DEST_DIR/${FILE_ROOT##*/}_${FILE_SFX}.pdf"
      else
          # Move the file pairs
          mv "${FILE_ROOT}.done" "$DEST_DIR/${FILE_ROOT##*/}.done"
          mv "${FILE_ROOT}.pdf"  "$DEST_DIR/${FILE_ROOT##*/}.pdf"
      fi
  fi
done

##
## End of script.
##
1
18.03.2021, 23:16

Попробуйте это:

for FILE in $(ls $SOURCE_DIR/*.done); do NAME=${FILE::-4}; mv ${NAME}pdf $DEST_DIR 2>/dev/null && mv $FILE $DEST_DIR; done
0
18.03.2021, 23:16

Теги

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