LINUX.ORG.RU

Вопрос про файлы


0

1

Уважаемые гуру Linux/Unix - систем. Подскажите пожалуйста правильный код bash-скрипта: Суть задачи - вывести список файлов, которые не принадлежат заданому пользователю. Формат тестирования скрипта: ./<name>.sh username /path То есть вывод должен быть такой: /home/user1/1/ja.txt ... /home/user2/ja1.txt Уже 3 или 4 варианта перепробовал и все безрезультатно, препод находит способ вывести не то, что нужно. Варианты могу написать, если потребуется. Заранее благодарю.

Уже 3 или 4 варианта перепробовал

показывай, чё уж там. и рассказывай на чём подловил твои скрипты препод: имена с пробелами, файлы начинающиеся с - ...

adriano32 ★★★
()
Ответ на: комментарий от adriano32

Показывал вариант такой: dir=$(pwd); cd / ; find «$dir» -type f -exec ls '{}' \; |grep -v «$1»\: |sed 's/^.*\.\//\//g' |grep -v «$dir»/«$2»

Выдавало путь полный. Имена папок и файлов с пробелами выводились. Подловил почему-то на моменте, когда было: ./1.sh user1 /home/user1

howhigh
() автор топика
Ответ на: комментарий от adriano32

Такой еще вышел вариант, но в конце добавлялся символ постоянно, который не удалось убрать: #!/bin/sh ls -Rl «$2» | sed '/\b\b\b'$1'\b\b\b\b/d' | sed 's/^[a-z -]*//1;' | sed 's/^[0-9]*//1;' | sed 's/^[a-z A-Z 0-9 ]*//1;' | sed 's/^[0-9]*//1;' | sed 's/^[A-Z a-z А-Я а-я]*//1;' | sed 's/^[0-9 ]*//1;' | sed 's/^[:]*//1;' | sed 's/^[0-9]*//1;' | sed 's/^[ ]*//1' 2>/dev/null

Еще один вариант: #!/bin/sh find $2 -type f | while read a do if [ `stat -c «%u» $a` .ne $1 ]; then echo $a fi done Но терминал выдал следующее: ubuntu@ubuntu:/home$ ./3.sh ubuntu home find: `home': No such file or directory ubuntu@ubuntu:/home$ ./3.sh ubuntu /home/ [: 8: 0: unexpected operator [: 8: 1002: unexpected operator [: 8: 1002: unexpected operator [: 8: 1002: unexpected operator stat: cannot stat `/home/user3/temp/this': No such file or directory ........................................................

howhigh
() автор топика
Ответ на: комментарий от howhigh

Re

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

howhigh
() автор топика
Ответ на: комментарий от AITap

Так задача состоит в том, чтобы вывести список файлов, которые не принадлежат пользователю, что мы задали в строке терминала при тестировании скрипта.

howhigh
() автор топика
Ответ на: комментарий от AITap

А вы можете сказать, что в приведенных выше скриптах было неправильно и как тогда должен выглядеть правильно скрипт?

howhigh
() автор топика
Ответ на: комментарий от howhigh

> А вы можете сказать, что в приведенных выше скриптах было неправильно
Использование внешних утилит там, где хватило бы средств самого find.

как тогда должен выглядеть правильно скрипт?

Приведённой выше информации хватит для того, чтобы написать правильный скрипт. Мне бы хотелось, чтобы Вы самостоятельно догадались, как это сделать.
http://www.linux.org.ru/jump-message.jsp?msgid=6290280&cid=6290360
http://www.linux.org.ru/jump-message.jsp?msgid=6290280&cid=6290372

AITap ★★★★★
()

#!/bin/sh
path=$(readlink -f «$2»)
find «$path» -type f ! -user «$1»

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

Если путь задан относительно и на выходе нужно тоже получать относительные пути то ещё проще.

Nao ★★★★★
()
Ответ на: комментарий от Nao

$(readlink -f «$2») - вот оно что... А если захочет вписать он относительный путь, но чтобы список выводился с абсолютным путем?

howhigh
() автор топика
Ответ на: комментарий от howhigh

> $(readlink -f «$2») - вот оно что... А если захочет вписать он относительный путь, но чтобы список выводился с абсолютным путем?
Попробуй, впиши, нам расскажешь что будет.

Nao ★★★★★
()
Ответ на: комментарий от Nao

а если в вашем варианте убрать readlink и добавить /:
find «$path/» -type f ! -user «$1»

backbone ★★★★★
()
Ответ на: комментарий от howhigh

Вы дали команду: найти в текущей директории директорию home и в ней какие-то файлы. Естественно, /home/home оказалась несуществующей. Вы, наверное, имели в виду /home.

AITap ★★★★★
()
Ответ на: комментарий от howhigh

что-то мне подсказывает, что readlink не сработает в случае с директорией, попробуйте чуть изменить вариант Nao так:

#!/bin/bash

find "$2/" -type f ! -user "$1"

./4.sh root /home

backbone ★★★★★
()
Ответ на: комментарий от AITap

/home - working;
/home/lalala/xlala - working
No prepod proverial tak je i kogda: ./4.sh user2 home;

Kasatelno find «$2» poluchaetsa, chto:
./4.sh user2 /home/user3:
/home/ubuntu/Desktop/ubiquity-gtkui.desktop
/home/ubuntu/.profile
/home/ubuntu/.bashrc
/home/ubuntu/.bash_logout
ubuntu@ubuntu:/home$ ./4.sh user2 /home/user3
/home/user3/test3/user53.txt
/home/user3/test3/user43.txt
/home/user3/test3/user33.txt
/home/user3/temp/this is sparta.txt
/home/user3/temp/user52.txt

Po idee doljno bilo vivesti:

/home/user3/test3/user53.txt
/home/user3/test3/user43.txt
.......
Tak 4to readlink vihodit nyjet

howhigh
() автор топика
Ответ на: комментарий от backbone

Я его вводил, просто мне readlink показался более подходящим, так как он тучу скрытых файлов не выводил :D Спс за помощь всем знатокам.

howhigh
() автор топика
Ответ на: комментарий от howhigh

readlink читает символическую ссылку, это не относится к директориям и скрытые файлы тут ни при чём

backbone ★★★★★
()

readlink я использовал для получения абсолютного пути, т.к. насколько я понял нужно было всегда выводить абсолютные пути, даже если в качестве аргумента поиска был задан относительный путь.

Nao ★★★★★
()
Ответ на: комментарий от Nao

Но readlink в случае относительного symlink выдаст относительный путь.

backbone ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.