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

Мне нужно написать сценарий 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

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

1
задан 9 June 2021 в 02:45

1 ответ

Помимо того факта, что

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 для сохранения режима, владения, временных меток).

1
ответ дан 28 July 2021 в 11:30

Другие вопросы по тегам:

Похожие вопросы: