unix каталогами - Перечислить файлы рекурсивно в CLI Linux с указанием пути к текущему каталогу




поиск работа (11)

Это похоже на этот вопрос , но я хочу включить путь относительно текущего каталога в unix. Если я сделаю следующее:

ls -LR | grep .txt

Он не включает в себя полные пути. Например, у меня есть следующая структура каталогов:

test1/file.txt
test2/file1.txt
test2/file2.txt

Вышеприведенный код вернет:

file.txt
file1.txt
file2.txt

Как я могу заставить его включать пути относительно текущего каталога, используя стандартные команды Unix?


Answers

Вместо этого вы можете использовать find:

find . -name '*.txt'

Это делает трюк:

ls -R1 $PWD | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done | grep -i ".txt"

Но это делает это «согрешающим» с анализом ls , хотя, который считается плохой формой сообществами GNU и Ghostscript.


Используйте tree с -f (полный путь) и -i (без отступов):

tree -if --noreport .
tree -if --noreport directory/

Затем вы можете использовать grep для фильтрации тех, которые вы хотите.

Если команда не найдена, вы можете установить ее:

Введите следующую команду для установки команды дерева на RHEL / CentOS и Fedora linux:

# yum install tree -y

Если вы используете Debian / Ubuntu, Mint Linux введите следующую команду в своем терминале:

$ sudo apt-get install tree -y

Чтобы получить фактические имена файлов нужных файлов с помощью команды find, используйте ее с помощью команды pwd:

find $(pwd) -name \*.txt -print

Используйте find:

find . -name \*.txt -print

В системах, которые используют GNU find, как и большинство дистрибутивов GNU / Linux, вы можете оставить вне -print.


Вы можете реализовать эту функцию следующим образом:
Во-первых, использование команды ls указывает на целевой каталог. Позже с помощью команды find откройте результат. Из вашего случая это звучит так: всегда имя файла начинается со словарного file***.txt

ls /some/path/here | find . -name 'file*.txt'   (* represents some wild card search)

DIR=your_path
find $DIR | sed 's:""$DIR""::'

«sed» удалит «ваш_path» из всех результатов поиска. И вы получаете относительно пути «DIR».


Попробуйте find . Вы можете посмотреть его точно на странице руководства, но это примерно так:

find [start directory] -name [what to find]

поэтому для вашего примера

find . -name "*.txt"

должен дать вам то, что вы хотите.


Если вы хотите сохранить детали, введите в свой файл ls, такие как размер файла и т. Д., Тогда это должно сработать.

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file

Вы можете создать функцию оболочки, например, в вашем .zshrc или .bashrc :

filepath() {
    echo $PWD/$1
}

filepath2() {
    for i in [email protected]; do
        echo $PWD/$i
    done
}

Очевидно, что первый будет работать только с одиночными файлами.


Вы можете использовать эту функцию. Если имя файла задано без относительного пути, то предполагается, что оно присутствует в текущем рабочем каталоге:

abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }

Использование:

$ abspath file.txt
/I/am/in/present/dir/file.txt

Использование с относительным путем:

$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt

С пробелами в имени файла:

$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt




linux unix recursion ls