LINUX.ORG.RU

почистить файл средствами sed

 


1

1

Приветствую.

У нас есть текстовый файл. Содержащий пути к файлам на сетевом диске.

/media/a26b5b55-159f-4ddf-ae7b-cd5ad067901d/Pub/Gazeta/Самореклама.doc
/media/a26b5b55-159f-4ddf-ae7b-cd5ad067901d/Pub/Gazeta/радиация.doc
/media/a26b5b55-159f-4ddf-ae7b-cd5ad067901d/Pub/Gazeta/самое-самое.doc

Нам нужно отделить название файла от пути к нему. Названия файлов мы уже вроде как отделили в отдельный файл. А вот путь взять не получается. Подскажите как средствами sed удалить текст после последнего слэша (слэш нужно оставить). При том, что общее колличество слэшей в строке может быть разным.

Заранее благодарен.

Перемещено leave из development

Ох жеж.
Имя файла

echo "/media/a26b5b55-159f-4ddf-ae7b-cd5ad067901d/Pub/Gazeta/Самореклама.doc" | xargs basename
Путь
echo "/media/a26b5b55-159f-4ddf-ae7b-cd5ad067901d/Pub/Gazeta/Самореклама.doc" | xargs dirname

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

Эм.. Спасибо. Что-то не в ту сторону начали копать просто ) Сейчас попробуем.

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

Потому что более привычный юзкейс:

cat some_text_file_which_contains_paths | xargs dirname
или
find -name "*.cpp" -print0 | xargs -0 dirname | sort | uniq

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

Ребят, есть проблемка. Файлов нужно обработать чуть более чем 11к. И среди них есть файлы в имени которых есть пробелы. При таком раскладе ни один из предложенных вариантов не прокатывает. Выводится только первое слово из имени. Может есть какие-то параметры, которые заставят вытащить имя целиком с пробелами?

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

Может есть какие-то параметры, которые заставят вытащить имя целиком с пробелами?

Определенно есть.

anonymous
()
### вывести все после последнего /
awk -F'/' '{print $NF}'

### вывести все до последнего /
awk -F'/' 'BEGIN {OFS="/"}; {$NF=""; print $0}'


# вместе
cat ${source_data} | awk -F'/' 'BEGIN {OFS="/"}; {print "filename="$NF; $NF=""; print "dirname="$0}
futurama ★★★★★
()
Ответ на: комментарий от invy

Пока не получается что-то.

Объясню к чему все это.. антивирусный сканер ClamAV прошелся по нашему диску и посчитал все DOC-овские файлы зараженными. Он выдрал их из своих законных папок и переместил все в одну единственную папку «Карантин». В итоге мы имеем папку с кучей файлов. И Лог ClamAV, который содержит полные пути, куда эти файлы нужно распихать.

Начали писать скрипт..

#!/bin/bash
file="/home/user/log3.txt"
while read line
do 
dir=$(awk -F'/' 'BEGIN {OFS="/"}; {$NF=""; print $0}') 
fil=$(awk -F'/' '{print $NF}')
echo "$fil"
echo "$dir"
done < $file

В итоге он выдает только переменную fil, а до dir дело не доходит.

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

почистить файл средствами sed

sed не нужен.

dir=$(awk -F'/' 'BEGIN {OFS="/"}; {$NF=""; print $0}')

Нахрена такие сложности?

#!/bin/bash

while read -r file; do
    printf '%s\n' "${file##*/}"
done

Не проверял.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.