Bash перемещение файлов в папки назначения - PullRequest
1 голос
/ 05 апреля 2020

У меня есть папки с такой структурой

parent
|-- output
    |-- 1.Abby
    |   |-- s001_clean.log
    |   |-- s001_clean.idx
    |   |-- s002_clean.log
    |   `-- s002_clean.idx
    |-- 2.Chris
    |   |-- s001.ppt
    |   `-- s002.ppt
    |-- 3.Bobby
        |-- s001.tar.gz
        `-- s002.tar.gz

Я бы хотел изменить их на эту

parent
|-- s001
    |-- 1.Abby
    |   |-- s001_clean.log
    |   `-- s001_clean.idx
    |-- 2.Chris
    |   `-- s001.ppt
    |-- 3.Bobby
    |   `-- s001.tar.gz
|-- s002
    |-- 1.Abby
    |   |-- s002_clean.log
    |   `-- s002_clean.idx
    |-- 2.Chris
    |   `-- s002.ppt
    |-- 3.Bobby
        `-- s002.tar.gz

Пока мне удалось создать s001 / s002 и Abby / Крис / Бобби папок.
Однако, когда я попытался переместить файлы внутрь, я получил только файл .log, чтобы переместить его к месту назначения.

  '''
  #!/usr/bin/env bash

  aa='1.A'
  bb='2.B'
  cc='3.C'


  for s in output/"$aa"/*_c*; do
    sn=${s%%_*}
    sn=${sn##*/}

    mkdir -p "${sn}"/$aa
    mkdir -p "${sn}"/$bb
    mkdir -p "${sn}"/$cc


  done
   '''

Я действительно не знаю, как go отсюда.
Как переместить файлы в каталог назначения?

Кроме того, есть ли способ сделать часть mkdir короче?
Я пробовал несколько способов, но они не работали.

Если бы кто-то мог помочь, это было бы здорово.
Спасибо

1 Ответ

0 голосов
/ 05 апреля 2020

С if grep -q "$sn" "$i" вы ищете $sn внутри содержимого файла, а не имя.
Используйте что-то вроде

if grep -q "$sn" <<< "$i";

или

if [[ $i = $sn* ]];

Ваш код будет не перемещать все файлы после изменения этого.
Я бы использовал что-то вроде

aa='1.childA' # original question, after edit aa=1a
while IFS=/ read -r s_output s_child s_file; do
   sn=${s_file%%_*}
   # debug echo "sn=$sn"
   while IFS=/ read -r output child file; do
      # Debug echo "sn=$sn f=$file"
      test -d "${sn}/${child}" || mkdir -p "${sn}/${child}"
      mv "output/$child/$file" "${sn}/${child}"
   done < <(find output -mindepth 2 -type f -name "${sn}*")
done < <(find output/$aa/ -name "*_*" -type f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...