Как переместить файлы в Linux по его имени в папку с соответствующим именем? - PullRequest
0 голосов
/ 31 января 2019

Мне нужно было бы переместить ряд файлов в определенных папках с помощью сценариев.Файлы имеют формат xxxx.date.0000, и мне нужно переместить их в папку, имя которой совпадает с заданным значением.

Например:

  • file hello.20190131.0000
  • в папке 20190131

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

 ls * .0000 | awk -F. '{Print $ 2}'

У кого-нибудь есть какие-либо предложения о том, как действовать?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Первоначальная команда awk дала большую часть ответа.Вам просто нужно что-то сделать с именем директории, которую вы извлекаете:

Простой вариант:

ls *.0000 | awk -F. '{printf "mkdir -p '%s'; mv '%s' '%s';",$2,$0,$2}' | sh

Это может быть более эффективно при большом количестве файлов:

ls *.0000 | awk -F. '{print $2}' |\
sort | uniq |\
while read dir; do
    mkdir -p "$dir"
    mv *."$dir".0000 "$dir"
done
0 голосов
/ 31 января 2019

Вы можете сделать это с помощью rename , он же Perl rename.

Попробуйте COPY ваших файлов во временном каталоге.

Если вы используете параметр -p, он автоматически создаст для вас все необходимые каталоги.Если вы используете параметр --dry-run, вы можете увидеть, что он будет делать, фактически ничего не делая.

rename --dry-run -p 'my @X=split /\./;  $_=$X[1] . "/" . $_'   hello*

Пример вывода

'hello.20190131.0000' would be renamed to '20190131/hello.20190131.0000'
'hello.20190137.0000' would be renamed to '20190137/hello.20190137.0000'

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

Итак, я разделил текущее имя на элементымассива X[] с точкой (точка) в качестве разделителя:

my @X = split /\./

Это дает мне выходной каталог в $X[1].Теперь я могу установить новое имя файла, который я хочу, поместив новый каталог, косую черту и старое имя файла в $_:

$_=$X[1] . "/" . $_

Вы также можете попробовать это, более короткая версия:

rename --dry-run -p 's/.*\.(\d+)\..*/$1\/$_/' hello*

  • В ArchLinux используемый вами пакет называется perl-rename.
  • В Debian он называется rename
  • В macOS,используйте доморощенный вот так: brew install rename
0 голосов
/ 31 января 2019

Я бы сделал что-то вроде этого:

ls *.0000 |\
  sort |\
    while read f; do
      foldername="`echo $f | cut -d. -f2`"
      echo mkdir +p "$foldername/"
      echo mv "$f" "$foldername/"
    done

, т. Е. Для каждого файла я создаю имя папки с помощью команды cut с точкой в ​​качестве разделителя полей и получаю второе поле(дата в этом случае);затем я создаю эту папку с помощью mkdir -p (флаг -p исключает любые предупреждения, если папка уже существует) и, наконец, перемещаю файл в совершенно новую папку.

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