Рейтинг:1

Скрипт Bash для копирования файлов в подкаталоги, названные в честь владельца файла

флаг cn

Мне нужно написать сценарий bash, который копирует файлы из папки в подпапки, названные в честь файлов. Например, есть общий каталог «Для всех», внутри находятся различные файлы и каталоги. Файлы имеют имена с именем владельца и некоторыми дополнительными символами, такими как tom1, tom2, tom3,... или scott1, scott2, scott3. Подпапки названы в честь владельцев: tom и scott. Мне нужно написать сценарий для копирования всех файлов в каталоге «Для всех» в соответствующие подпапки. Это мой сценарий.

#!/бин/баш
forall=/home/anastasia/Скрипты
компакт-диск $ forall
для файла в $forall
 делать
        если [ -d $ файл ]
          тогда
                Продолжить
          фи
          если [ -e $ файл ]
          тогда
                владелец='ls -l $файл | grep "^-" | awk {'напечатать $£3'}'
                $файл=$владелец*   
                cp $file $forall/$owner
                chown $owner $forall/$owner/$file
        фи
сделано

Что не так с моим скриптом? Это ничего не делает.

Рейтинг:1
флаг hr

Помимо того, что

для файла в $forall

выполнит цикл только один раз, с $ файл установить на каталог /home/anastasia/Скрипты, основная проблема в том, что

владелец='ls -l $файл | grep "^-" | awk {'напечатать $£3'}'

присваивает литеральную строку ls -l $ файл | grep "^-" | авк {печать к переменной владелец (а затем пытается выполнить $3} как команда).

Предположительно, вы предполагали, что внешние кавычки будут подстановкой команд обратные кавычки3 фунта стерлингов быть простым 3):

владелец=`ls -l $файл | grep "^-" | awk {'напечатать $3'}`

однако современный способ будет использовать $(...) вместо:

владелец=$(ls -l $file | grep "^-" | awk {'print $3'})

Однако это ужасный способ найти владельца файла; вместо этого я бы рекомендовал

владелец=$(stat -c %U -- "$file")

Кроме того, не забудьте указать свои расширения переменных, например (непроверено):

#!/бин/баш

forall=/home/anastasia/Скрипты

для файла в "$forall"/*
делать
  если [-d "$файл"]; тогда
    Продолжить
  фи
  если [-е "$файл"]; тогда
    владелец=$(stat -c %U -- "$file")
    cp -n "$file" "$forall/$owner"/
    chown "$owner" "$forall/$owner/$file"
  фи
сделано

Обратите внимание, что вы должны быть в состоянии устранить чаун путем добавления соответствующих опций для ср (возможно -п чтобы сохранить режим, право собственности, временные метки).

Kanarise avatar
флаг cn
Большое спасибо за ценный отзыв! Способ, который вы предлагаете с cp -p и owner=$(stat -c %U --"$file"), действительно более элегантен. Я внес необходимые изменения, и это сработало с одним пользователем. Я посмотрю на это дальше.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.