Создайте каталог из метки времени файла, затем переместите файл в этот каталог в bash - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть каталог с сотнями файлов (macos), и я хотел бы, чтобы bash-скрипт копировал каждый файл в каталог с меткой создания файла. Таким образом, если temp.mp4 был создан 2019-12-10, файл будет скопирован в этот каталог, который может существовать или не существовать.

Я не хочу ничего записывать во временный файл, если я наденуне должен. Я обнаружил, что следующий код получает только файл и дату в формате ГГГГ-ММ-ДД:

gls -lt --time-style=+"%Y-%m-%d" | awk '{print $6,$7}'

Но я не уверен, как выполнить итерацию / тестирование (передать его в другой экземпляр awk?). Псевдокод:


  if ([ -f $7 ] && if ([ -d $6 ]  #If the file and directory exist
  {
    mv $7 $6  #move the file to the existing directory
  }
  else
  {
    mkdir $6 #create the directory based on date creation attribute of the file
    mv $7 $6 #move the file to the directory
  }

Мне не нужно беспокоиться о рекурсивном просмотре каталогов. Все файлы находятся в одном каталоге.

============ Исходя из некоторых отзывов ниже, я расширяю свой вопрос, чтобы уточнить, что я вижу. Вот скрипт, который я использую (обратите внимание на изменение с «* .mp4» на $ 1):

#!/bin/bash

gstat -c '%w %n' $1 | gcut --complement -f 2,3 -d' ' | while read FILE
do
   NAME=${FILE#* }
   DATE=${FILE%% *}
   [ -d ${DATE} ] || mkdir ${DATE}
   mv -i "${NAME}" ${DATE}/
done

В моем каталоге есть два файла, которые не перемещаются. Вот как выглядит каталог (ls -l):

╰─ ls -l
total 16
drwxr-xr-x  9 awagoner  staff  288 Nov  6 21:44 2019-11-03
drwxr-xr-x  4 awagoner  staff  128 Nov  7 11:19 2019-11-06
-rw-r--r--  1 awagoner  staff  138 Mar 19  2019 Pipfile
-rw-r--r--@ 1 awagoner  staff  715 Nov  1 13:53 php_errorlog

Я не уверен, что делать, чтобы переместить все файлы в связанный каталог. Есть ли определенная строка, которая будет охватывать все файлы (AAA, AAA.AAA, .AAA)?

1 Ответ

0 голосов
/ 06 ноября 2019

Отличным инструментом для доступа к информации о файле является stat . Итак, сначала попросите stat дать даты создания и имена файлов, чтобы мы могли выполнить итерации по каждому из них:

 stat -c '%w %n' *.mp4

Пропустить через cut , что приведет к удалению лишних столбцов, которые вы надеваете't Want (время и часовой пояс):

 stat -c '%w %n' *.mp4 | cut --complement -f 2,3 -d' '

Теперь наш вывод - 1 строка на файл с датой и именем файла. Возможно, у вас есть имена файлов с пробелами, так что следите за этим при разборе. Этот небольшой кусочек сделает все правильно:

 NAME=${FILE#* }
 DATE=${FILE%% *}   

Наконец, убедитесь, что каталог существует, и переместите файл в новый дом:

 [ -d ${DATE} ] || mkdir ${DATE}
 mv "${NAME}" ${DATE}/

Соберите все вместе. Это то, что вы хотите запустить:

stat -c '%w %n' *.mp4 | cut --complement -f 2,3 -d' ' | while read FILE
do
   NAME=${FILE#* }
   DATE=${FILE%% *}
   mkdir -p ${DATE}
   mv -i "${NAME}" ${DATE}/
done

Обновлено: используйте предложение от jhnc выше, добавив флаг -i на mv

Обновлено (2): больше отзывов jhnc (реальные мозги позади)этот ответ :))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...