#linux #bash #cut #file-extension #wc
#linux #bash #вырезать #расширение файла #wc
Вопрос:
У меня есть следующая строка:
wc -l ./*.txt | sort -rn
я хочу сократить расширение файла. Итак, с помощью этого кода я получил вывод:
число filename.txt
для всех моих .txt-файлов в каталоге .-. Но я хочу, чтобы вывод без расширения файла, например: number filename
Я попробовал канал с cut для разных типов параметров, но все, что я получил, это вырезать все имя файла с помощью этой команды.
wc -l ./*.txt | sort -rn | cut -f 1 -d '.'
Ответ №1:
Предполагая, что у вас нет новых строк в вашем имени файла, которое вы можете использовать sed
для удаления окончания .txt
:
wc -l ./*.txt | sort -rn | sed 's/.txt$//'
Комментарии:
1. Спасибо за помощь, я использовал rev-command, но sed также работает!
2. Это ваш выбор, но вместо одного
sed
использованияrev cut rev
(3 команды) совершенно не нужно и неэффективно.3. Это правда. Теперь я заменил rev на sed. Тот же вывод, но меньше кода.
Ответ №2:
к сожалению, cut
не имеет синтаксиса для извлечения столбцов в соответствии с индексом с конца. Один (несколько неуклюжий) трюк заключается в том, чтобы использовать rev
обратную строку, применить cut
к ней, а затем rev
вернуть ее обратно:
wc -l ./*.txt | sort -rn | rev | cut -d'.' -f2- | rev
Ответ №3:
Использование sed
более общего способа отсечения любого расширения, которое имеют файлы:
$ wc -l *.txt | sort -rn | sed 's/.[^.]*$//'
14 total
8 woc
3 456_base
3 123_base
0 empty_base
Ответ №4:
Лучший подход с использованием правильного типа mime (какое расширение tar.gz
или такие множественные расширения ?)
#!/bin/bash
for file; do
case $(file -b $file) in
*ASCII*) echo "this is ascii" ;;
*PDF*) echo "this is pdf" ;;
*) echo "other cases" ;;
esac
done
Это POC, не тестировался, не стесняйтесь адаптировать / улучшать / изменять
Комментарии:
1. это не совсем то, что я хотел, но в любом случае спасибо за вашу помощь.