LINUX.ORG.RU

Выполнить скрипт bash в папке найденного файла

 ,


0

1

Добрый день! Есть дерево папок. Скрипт выполняется в текущей папке, где сам скрипт находится.

for i in */*.mp4; do

echo "$i"
pwd
COMMAND

done
результат echo и pwd
01 Course Introduction/01 01 Course Introduction.mp4
/home/user/Pluralsight - Docker Deep Dive
02 Introducing Containers/02 01 The Rise of the Virtual Machine.mp4
/home/user/Pluralsight - Docker Deep Dive
Так же пробую выполнить через find
find . -name "*.mp4" -exec pwd \;
/home/user/Pluralsight - Docker Deep Dive
/home/user/Pluralsight - Docker Deep Dive
Как выполнить скрипт bash, если бы он находился в папке найденного файла? Т.е. если бы скрипт находился в папке
/home/user/Pluralsight - Docker Deep Dive/01 Course Introduction/

Ответ на: комментарий от chemtech

Pastebin.com has blocked your IP :(
Follow @pastebin
We have blocked your IP from accessing our website because we have detected unnatural browsing behavior. Depending on the violation, the block could be temporary, but also permanent.

А теперь залей на нормальный сервис, а не pastebin.

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

А cd это идея. Сначала нужно показать директории

ls -d */
, потом войти и выполнить. Попробую.

chemtech ()

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

anonymous ()

наверное правильно сделать так: вместо этого:

for i in */*.mp4; do

написать:

for i in $(find /home/user/Pluralsight -name '*.mp4')

Таким образом на STDOUT у тебя выйдет список с полными путями к файлам по маске что ты искал. Ну а дальше делаешь с ними что хочешь.

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

Что-то не могу понять, что не так.

#!/bin/bash

ls -d */ > dir.txt

for j in $(cat dir.txt); do

    echo $j
    cd "$j"

#    for i in */*.mp4; do

#       google youtube post --category Education --access private "$i"

#    done

#       google youtube list > loaded.txt

#       cat loaded.txt | cut -d ',' -f 2 > link.txt

#    for i in $(cat link.txt); do

#       youtube-dl  --skip-download  --write-auto-sub "$i" -o '%(title)s.%(ext)s'

#    done

#       for i in *.srt; do

#       cat "$i"| grep -v "^[0-9]" |  dos2unix | sed -e '/^$/d' | sed ':a;N;$!ba;s/\n/ /g' | tr -s [:blank:] ' ' | sed -e 's/\. /\.\n /g' | sed 's/^[ \t]*//' | sed G > "$i".txt;

#    done

    pwd
    cd ..

01
./2: строка 8: cd: 01: Нет такого файла или каталога
/home/user/Pluralsight - Docker Deep Dive
Course
./2: строка 8: cd: Course: Нет такого файла или каталога
/home/user
Introduction/
./2: строка 8: cd: Introduction/: Нет такого файла или каталога
/home
02
./2: строка 8: cd: 02: Нет такого файла или каталога
/
Introducing
./2: строка 8: cd: Introducing: Нет такого файла или каталога
/
Containers/
./2: строка 8: cd: Containers/: Нет такого файла или каталога
chemtech ()
Ответ на: комментарий от CHIPOK

Мы сейчас не об этом, а о том, что пастебин так не работает. Тогда к чертям его.

DeadEye ★★★★★ ()

Так же пробую выполнить через find

$ man find | grep -m2 -A7 ' -execdir'

-execdir command ;

-execdir command {} +

Like -exec, but the specified command is run from the subdirectory containing the matched file, which is not normally the directory in which you started find. This a much more secure method for invoking commands, as it avoids race conditions during resolution of the paths to the matched files. As with the -exec action, the `+' form of -execdir will build a command line to process more than one matched file, but any given invocation of command will only list files that exist in the same subdirectory. If you use this option, you must ensure that your $PATH environment variable does not reference `.'; otherwise, an attacker can run any commands they like by leaving an appropriately-named file in a directory in which you will run -execdir. The same applies to having entries in $PATH which are empty or which are not absolute directory names.

CHIPOK, chemtech, for i in ... делит "..." как аргументы командной строки, по символам из $IFS, что означает, что пробелы в именах файлов (и вообще спецсимволы) не выживают. Если нужно написать велосипед, делите либо по \n, либо, лучше, по \0 (только \0 не может встретиться в пути к файлу) при помощи read. Если нужно тупо перебрать все файлы, достаточно for i in *.

AITap ★★★★★ ()
Последнее исправление: AITap (всего исправлений: 2)
Ответ на: комментарий от chemtech

смотри, команда ls -d */ выводит список папок которые находятся в твоем текущем каталоге ./ дальше ты делаешь вход в каждый из этих каталогов, первый вход у тебя успешный, но последующие с ошибкой так как нет таких каталогов в той папке что ты зашол. Суть уловил?

CHIPOK ★★★ ()
Ответ на: комментарий от DeadEye
echo $(pwd)/*
ls -d $(pwd)/*
/home/user/Pluralsight - Docker Deep Dive/*
ls: невозможно получить доступ к /home/user/Pluralsight: Нет такого файла или каталога
ls: невозможно получить доступ к -: Нет такого файла или каталога
ls: невозможно получить доступ к Docker: Нет такого файла или каталога
ls: невозможно получить доступ к Deep: Нет такого файла или каталога
ls: невозможно получить доступ к Dive/*: Нет такого файла или каталога
chemtech ()
Ответ на: комментарий от chemtech

А, вон оно что! Не хватает просто кавычек =)

echo "$(pwd)/*"
ls -d "$(pwd)/*"

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

команда ls -d */ выводит список папок которые находятся в твоем текущем каталоге ./

Она мало чем отличается от ls . - ключ -d всего лишь заставляет показывать имена директорий, встреченных среди аргументов командной строки, а не их содержимое.

Самый простой, удобный и надёжный способ - обойтись без ls, в цикле перебрать * (звёздочка сама раскроется в список содержимого текущей директории, и даже если в именах файлов попался \n, ничего не сломается) и пропускать итерацию, если test -d "$i" вернул 1.

AITap ★★★★★ ()
Последнее исправление: AITap (всего исправлений: 2)
Ответ на: комментарий от chemtech

сделай так

 #!/bin/bash

 for j in $(ls -d */); do
     echo $j
     ls $j
     echo ----------------------------------
     done

CHIPOK ★★★ ()
Последнее исправление: CHIPOK (всего исправлений: 1)
Ответ на: комментарий от CHIPOK

Основую часть скрипта вывел в отельный скрипт, и сделал find . -name «*.mp4» -execdir скрипт \; Вроде работает

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

я тебе помог? чет не заметил чем. Ну тогда пожалуйста. :)

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

и я о этом говорю

Но продолжаете советовать for j in $(ls -d */) и операции с переменными без кавычек вместо for j in *; do echo "$j"; done. Первое сломается, если файл окажется с пробельными символами в имени. Второе - нет. Оба цикла перебирают всё содержимое директории, а не только поддиректории.

AITap ★★★★★ ()

man dirname
man basename
Вкраце:

DIRNAME=`which dirname`
CD=`which cd`
$CD "$($DIRNAME $0)"
--

P.S. замена кавычек была неожиданной.

fractaler ★★★★★ ()
Последнее исправление: fractaler (всего исправлений: 1)
Ответ на: комментарий от AITap

я ему суть работы обьяснил, о кавычках он сам догадался еще в начале. Бобер выдыхай...

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