2013-12-16 3 views
1

У меня есть требования в команде UNIX , где я есть путь, подобный этому:Удалить Префикс пути из дерева UniX

path/to/file/manyfiles.extensions 

Теперь я хочу что-то подобное TO-

file/manyfiles.extensions 

сейчас Я могу сделать это, перечисляя как/path/to, так и/path, удаляя их по одному.

но я могу получить только «/ path/to» в качестве своего ввода, и мне нужно удалить оба из дерева в одну команду.

Может показаться, что я могу перечислить 2 папки для удаления, но во многих случаях я получаю структуры, имеющие 12-13 подпапок, в которых мне во многих случаях нужна только первая и последняя папка.

например - `Source файлы - целевые/классы/

Удалить префикс - target`

Результат:

classes/my/code/HelloWorld.class 
classes/my/code/HelloWorldImpl.class 
classes/my/code/Main.class 
+1

Ваш вопрос не очень понятно.Можете ли вы попытаться объяснить это снова с некоторыми примерами. – anubhava

+0

Позвольте мне сделать его более простым - Предположим, у вас есть такой адрес: folder2/folder3/folder4/folder5/folder6/folder7/file.txt Теперь эта структура занимает слишком много времени для обработки моей работы Я хочу, чтобы структуру, которую нужно обрезать примерно так: folder6/folder7/file.txt – Rahul

+0

Итак, в конце концов, вы хотите сохранить последние 2 подпапки и имя файла? – anubhava

ответ

1

Вы хотите, чтобы команда basename раздеться каталоги от вашего filename, в сочетании с командой dirname, которая даст вам только структуру каталогов.

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

Что-то, как в этом псевдокоде:

original_file='/some/long/path/to/a/file' 
file_name=$(basename $original_file) 
dir_name=$(dirname $original_file) 

short_dir='...use regex or whatever logic you need to pear ${dir_name} down (we'll need more info to help with this)' 

new_file="${short_dir}/${file_name}" 
5

Если я правильно понимаю ваш вопрос, вы хотите, чтобы сдирать некоторый заданный префикс на пути. Принимая во внимание декларацию path=/a/path/to/a/directory и шаблон *a/ вы можете сдирать префикс, соответствующий этому шаблону двумя способами в Bash:

echo ${path#*a/} # outputs "path/to/a/directory" 
echo ${path##*a/} # outputs "directory" 

Первый вариант не жадный и останавливается в первом матче, в то время как второй жаден и останавливается при максимально возможном совпадении рисунка. Образец *a/ происходит здесь дважды, поэтому результаты затем различаются.

В вашем случае шаблон будет нечто вроде path/to и пути path/to/file/manyfiles.extensions, поэтому одним из следующих будет работать, в зависимости от того, нужно ли быть жадным или нет:

path=path/to/file/manyfiles.extensions 
path=${path#*path/to/} # assigns "file/manyfiles.extensions" to $path 

или

path=path/to/file/manyfiles.extensions 
path=${path##*path/to/} # assigns "file/manyfiles.extensions" to $path 

Для справки, читайте о Bash parameter expansion.

1

Вы можете попробовать grep -oP:

p="older2/folder3/folder4/folder5/folder6/folder7/file.txt" 
s=$(grep -oP '([^/]+/){2}[^/]+/?$' <<< "$p") 
echo "$s" 

ВЫВОД:

folder6/folder7/file.txt 
Смежные вопросы