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не совсем понял, что вы хотите, но у вас опять команда неправильная =) Надо так примерно:
|