Мне нужно написать сценарий bash, который копирует файлы из папки в подпапки, названные в честь файлов. Например, есть общий каталог «Для всех», внутри есть разные файлы и каталоги. Файлы имеют имена с именем владельца и некоторыми дополнительными символами, такими как tom1, tom2, tom3, ... или scott1, scott2, scott3. Подпапки названы в честь владельцев: Тома и Скотта. Мне нужно написать сценарий для копирования всех файлов из каталога «Для всех» в соответствующие подпапки. Это мой сценарий.
#!/bin/bash
forall=/home/anastasia/Scripts
cd $forall
for file in $forall
do
if [ -d $file ]
then
continue
fi
if [ -e $file ]
then
owner='ls -l $file | grep "^-" | awk {'print $£3'}'
$file=$owner*
cp $file $forall/$owner
chown $owner $forall/$owner/$file
fi
done
Что не так с моим сценарием? Ничего не делает.
Помимо того факта, что
for file in $forall
выполнит цикл только один раз, когда $ file
установлен в каталог / home / anastasia / Scripts
, основная проблема состоит в том, что
owner='ls -l $file | grep "^-" | awk {'print $£3'}'
присваивает буквальную строку ls -l $ file | grep "^ -" | awk {выводит
переменной владельца
(а затем пытается выполнить $ £ 3}
как команду).
Предположительно, вы хотели, чтобы внешние кавычки были заменой команд обратными кавычками (и £ 3
были простыми 3
):
owner=`ls -l $file | grep "^-" | awk {'print $3'}`
однако современный способ вместо этого будет использовать $ (...)
:
owner=$(ls -l $file | grep "^-" | awk {'print $3'})
Однако это ужасный способ найти владельца файла; вместо этого я бы порекомендовал
owner=$(stat -c %U -- "$file")
. Кроме того, не забудьте процитировать ваши расширения переменных, например (непроверено):
#!/bin/bash
forall=/home/anastasia/Scripts
for file in "$forall"/*
do
if [ -d "$file" ]; then
continue
fi
if [ -e "$file" ]; then
owner=$(stat -c %U -- "$file")
cp -n "$file" "$forall/$owner"/
chown "$owner" "$forall/$owner/$file"
fi
done
Обратите внимание, что вы сможете удалить chown
, добавив соответствующие параметры для cp
(возможно, -p
для сохранения режима, владения, временных меток).