| kotnaton |  | 
| 
                Темы:
                
                    52
                
             
                Сообщения:
                
                    208
                
             
                Участник с: 28 июня 2012
             | Задача, собственно,  заключается в том, чтобы находить файлы с нужным расширением и перемещать их на 1 уровень выше... Покурив в интернете, получилось такое вот борзописание: #!/bin/bash
for s in $( find . -name *.mp3 ) ;
        do
                set destination = $i | awk '{ n = split(s, fld, "\n")
                sizepath = fld[1]
                m = split(sizepath, nodes, "/")
                for( j = 1; j-1 < m; j++ )
                dir = dir nodes[j] "/"
                print(dir) }' ;
                echo $destiantion
        done | 
| arcanis |  | 
|   
                Темы:
                
                    31
                
             
                Сообщения:
                
                    1496
                
             
                Участник с: 09 сентября 2012
             | или я чего то не понял или зачем так сложно? #!/bin/bash for ITEM in $(find * -iname '*.mp3'); do mv "$ITEM" "$(dirname "$ITEM")/../$(basename "$ITEM")"; done | 
| kotnaton |  | 
| 
                Темы:
                
                    52
                
             
                Сообщения:
                
                    208
                
             
                Участник с: 28 июня 2012
             | Доброго дня ! arcanisСпасибо, хорошее решение :) Только здесь надо определить переменную IFS иначе find будет "разделять" по пробелам #!/bin/bash IFS=" " for ITEM in $(find * -iname '*.mp3'); do mv "$ITEM" "$(dirname "$ITEM")/../$(basename "$ITEM")"; done | 
| arcanis |  | 
|   
                Темы:
                
                    31
                
             
                Сообщения:
                
                    1496
                
             
                Участник с: 09 сентября 2012
             | да, я с пробелами не тестил) На самом деле не знаю, я в find не такой большой спец А вообще find позволяет тут же и команду выполнить: find . -iname '*.mp3' -execdir mv {} ../{} \; | 
| kotnaton |  | 
| 
                Темы:
                
                    52
                
             
                Сообщения:
                
                    208
                
             
                Участник с: 28 июня 2012
             | arcanis, спасибо ! | 
| kotnaton |  | 
| 
                Темы:
                
                    52
                
             
                Сообщения:
                
                    208
                
             
                Участник с: 28 июня 2012
             | Продолжу мучать тему: А какая принципиальная разница между командами mv и ln -s ? Попробовал так: #!/bin/bash IFS=" " for ITEM in $(find * -iname '*.mp3'); do ln -s "$ITEM" "$(dirname "$ITEM")/../$(basename "$ITEM")"; done И получается, что ссылка создается не ожидаемого Track1.mp3 -> Soundtrack/Track1.mp3 а такого вида: Track1.mp3 -> film/Soundtrack/Track1.mp3 - то есть опять рекурсия: есть папка film, где и создаются ссылки, но нет папки film/film Строка: for i in $( find . -name *.mp3 ) ; do ln -s $i $(dirname "$i")/../$(basename "$i") ; done Дает такой же результат - в цели ссылки, после относительного адреса (точки) повторяет имя родительской папки. ??? UPD: Да, и в порядке полного идиотизма, так find . -name *.mp3 -execdir ln -s {} ../{} \; создаются ссылки на самих себя :( | 
| arcanis |  | 
|   
                Темы:
                
                    31
                
             
                Сообщения:
                
                    1496
                
             
                Участник с: 09 сентября 2012
             | это проблема в понимании работы команды ln. Ей по барабану на первый аргумент, что напишете, туда и будет ссылаться. А потом шелл будет удивляться на какой нибудь файл в корневой директории, навроде superproga -> ../../../../bin/superproga. Правильный вариант, наверное, такой: find * -type f -name '*.mp3' -execdir ln -sr {} -t ../ \;В общем там надо путь, на что ссылается, раскрывать каким угодно образом (в циклах for тоже самое) | 
| kotnaton |  | 
| 
                Темы:
                
                    52
                
             
                Сообщения:
                
                    208
                
             
                Участник с: 28 июня 2012
             | arcanis Спасибо. Отличное решение, равно как спасибо и за basename и dirname, но все-таки проблемка с рекурсией внутри адреса файла остается, например, если надо в каждой директории, где есть, например фотографии, оставить их список: К сожаалению, такая конструкция создает только один list.txt - в корне рабочей директории. Беда в том, что оператор dirname воспринимает адрес файла слитно, не позволяя разделять вложения по '/' | 
| Natrio |  | 
| 
                Темы:
                
                    47
                
             
                Сообщения:
                
                    4763
                
             
                Участник с: 08 января 2011
             | kotnaton, пожалуйста, сформулируйте чётко – что вам требуется сделать? Звучит несколько странно и рекурсивно само по себе – находим файлы, перемещаем их на уровень выше, потом снова находим, перемещаем ещё выше... Где тут смысл? Что требуется на самом деле? | 
| arcanis |  | 
|   
                Темы:
                
                    31
                
             
                Сообщения:
                
                    1496
                
             
                Участник с: 09 сентября 2012
             | kotnatonне совсем понял, что вы хотите, но у вас опять команда неправильная =) Надо так примерно:  |