Получить путь к файлу относительно

У меня есть два каталога A и B. Каждый из них содержит zip.

Как я могу записать путь этих двух zip-файлов в текстовый файл?

Пример для системы каталогов:

FILES/ONE/one.zip FILES/TWO/two.zip

И я хочу запустите команду из каталога FILES

4
задан 10 January 2018 в 18:32

15 ответов

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

/tmp/FILES$ find . -name "*.zip" -print > outfile.txt

Найти каждый файл, закончившийся с zip внутри текущей папки (FILES ]) и распечатать его путь. Вывод команды find направлен в текстовый файл:

Содержимое outfile.txt:

/tmp/FILES$ cat outfile.txt 

./TWO/two.zip
./ONE/one.zip
Обратите внимание, если вы выполните команду find в одной папке над папкой FILES, на ваш вывод будет также включена FILES часть папки.

, например. когда поиск выводится на stdout

/tmp$ find FILES -name "*.zip" -print
FILES/TWO/two.zip
FILES/ONE/one.zip
8
ответ дан 22 May 2018 в 15:38

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

/tmp/FILES$ find . -name "*.zip" -print > outfile.txt

Найти каждый файл, закончившийся с zip внутри текущей папки (FILES ]) и распечатать его путь. Вывод команды find направлен в текстовый файл:

Содержимое outfile.txt:

/tmp/FILES$ cat outfile.txt ./TWO/two.zip ./ONE/one.zip Обратите внимание, если вы выполните команду find в одной папке над папкой FILES, на ваш вывод будет также включена FILES часть папки.

, например. когда поиск выводится на stdout

/tmp$ find FILES -name "*.zip" -print FILES/TWO/two.zip FILES/ONE/one.zip
8
ответ дан 17 July 2018 в 23:25

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

/tmp/FILES$ find . -name "*.zip" -print > outfile.txt

Найти каждый файл, закончившийся с zip внутри текущей папки (FILES ]) и распечатать его путь. Вывод команды find направлен в текстовый файл:

Содержимое outfile.txt:

/tmp/FILES$ cat outfile.txt ./TWO/two.zip ./ONE/one.zip Обратите внимание, если вы выполните команду find в одной папке над папкой FILES, на ваш вывод будет также включена FILES часть папки.

, например. когда поиск выводится на stdout

/tmp$ find FILES -name "*.zip" -print FILES/TWO/two.zip FILES/ONE/one.zip
8
ответ дан 24 July 2018 в 13:56

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

/tmp/FILES$ find . -name "*.zip" -print > outfile.txt

Найти каждый файл, закончившийся с zip внутри текущей папки (FILES ]) и распечатать его путь. Вывод команды find направлен в текстовый файл:

Содержимое outfile.txt:

/tmp/FILES$ cat outfile.txt ./TWO/two.zip ./ONE/one.zip Обратите внимание, если вы выполните команду find в одной папке над папкой FILES, на ваш вывод будет также включена FILES часть папки.

, например. когда поиск выводится на stdout

/tmp$ find FILES -name "*.zip" -print FILES/TWO/two.zip FILES/ONE/one.zip
8
ответ дан 24 July 2018 в 16:53

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

/tmp/FILES$ find . -name "*.zip" -print > outfile.txt

Найти каждый файл, закончившийся с zip внутри текущей папки (FILES ]) и распечатать его путь. Вывод команды find направлен в текстовый файл:

Содержимое outfile.txt:

/tmp/FILES$ cat outfile.txt ./TWO/two.zip ./ONE/one.zip Обратите внимание, если вы выполните команду find в одной папке над папкой FILES, на ваш вывод будет также включена FILES часть папки.

, например. когда поиск выводится на stdout

/tmp$ find FILES -name "*.zip" -print FILES/TWO/two.zip FILES/ONE/one.zip
8
ответ дан 24 July 2018 в 17:02

Простая оболочка оболочки может достичь этого. Например, с учетом

$ tree .
.
├── ONE
│   └── one.zip
└── TWO
    └── two.zip

2 directories, 2 files

, тогда

$ printf '%s\n' */*.zip
ONE/one.zip
TWO/two.zip

Перенаправить вывод в файл, добавив > outfile к команде. Если вы хотите добавить ./, чтобы сделать относительный путь более явным, измените %s на ./%s

$ printf './%s\n' */*.zip > outfile
$ cat outfile
./ONE/one.zip
./TWO/two.zip

. Если вы хотите сделать это рекурсивно, тогда bash поддерживает это, если вы включили опцию globstar shell, например

$ cd ..
$ shopt -s globstar
$ printf '%s\n' **/*.zip
FILES/ONE/one.zip
FILES/TWO/two.zip

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

2
ответ дан 22 May 2018 в 15:38

Или вы можете сделать это с помощью regex

find /tmp/FILES -regextype posix-egrep -regex ".*/*/*.zip" > outfile.txt

. Вывод одинаков:

./TWO/two.zip
./ONE/one.zip

Проблема в том, что он будет соответствовать всем zip-файлам в любой подпапке , Если вы можете определить подпапки, содержащие файлы, которые вы можете сделать:

find /tmp/FILES -regextype posix-egrep -regex ".*/(ONE|TWO)/*.zip" > outfile.txt
0
ответ дан 22 May 2018 в 15:38

Или вы можете сделать это с помощью regex

find /tmp/FILES -regextype posix-egrep -regex ".*/*/*.zip" > outfile.txt

. Вывод одинаков:

./TWO/two.zip ./ONE/one.zip

Проблема в том, что он будет соответствовать всем zip-файлам в любой подпапке , Если вы можете определить подпапки, содержащие файлы, которые вы можете сделать:

find /tmp/FILES -regextype posix-egrep -regex ".*/(ONE|TWO)/*.zip" > outfile.txt
0
ответ дан 17 July 2018 в 23:25

Простая оболочка оболочки может достичь этого. Например, с учетом

$ tree . . ├── ONE │   └── one.zip └── TWO └── two.zip 2 directories, 2 files

, тогда

$ printf '%s\n' */*.zip ONE/one.zip TWO/two.zip

Перенаправить вывод в файл, добавив > outfile к команде. Если вы хотите добавить ./, чтобы сделать относительный путь более явным, измените %s на ./%s

$ printf './%s\n' */*.zip > outfile $ cat outfile ./ONE/one.zip ./TWO/two.zip

. Если вы хотите сделать это рекурсивно, тогда bash поддерживает это, если вы включили опцию globstar shell, например

$ cd .. $ shopt -s globstar $ printf '%s\n' **/*.zip FILES/ONE/one.zip FILES/TWO/two.zip

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

2
ответ дан 17 July 2018 в 23:25

Или вы можете сделать это с помощью regex

find /tmp/FILES -regextype posix-egrep -regex ".*/*/*.zip" > outfile.txt

. Вывод одинаков:

./TWO/two.zip ./ONE/one.zip

Проблема в том, что он будет соответствовать всем zip-файлам в любой подпапке , Если вы можете определить подпапки, содержащие файлы, которые вы можете сделать:

find /tmp/FILES -regextype posix-egrep -regex ".*/(ONE|TWO)/*.zip" > outfile.txt
0
ответ дан 24 July 2018 в 13:56

Простая оболочка оболочки может достичь этого. Например, с учетом

$ tree . . ├── ONE │   └── one.zip └── TWO └── two.zip 2 directories, 2 files

, тогда

$ printf '%s\n' */*.zip ONE/one.zip TWO/two.zip

Перенаправить вывод в файл, добавив > outfile к команде. Если вы хотите добавить ./, чтобы сделать относительный путь более явным, измените %s на ./%s

$ printf './%s\n' */*.zip > outfile $ cat outfile ./ONE/one.zip ./TWO/two.zip

. Если вы хотите сделать это рекурсивно, тогда bash поддерживает это, если вы включили опцию globstar shell, например

$ cd .. $ shopt -s globstar $ printf '%s\n' **/*.zip FILES/ONE/one.zip FILES/TWO/two.zip

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

2
ответ дан 24 July 2018 в 13:56

Или вы можете сделать это с помощью regex

find /tmp/FILES -regextype posix-egrep -regex ".*/*/*.zip" > outfile.txt

. Вывод одинаков:

./TWO/two.zip ./ONE/one.zip

Проблема в том, что он будет соответствовать всем zip-файлам в любой подпапке , Если вы можете определить подпапки, содержащие файлы, которые вы можете сделать:

find /tmp/FILES -regextype posix-egrep -regex ".*/(ONE|TWO)/*.zip" > outfile.txt
0
ответ дан 24 July 2018 в 16:53

Простая оболочка оболочки может достичь этого. Например, с учетом

$ tree . . ├── ONE │   └── one.zip └── TWO └── two.zip 2 directories, 2 files

, тогда

$ printf '%s\n' */*.zip ONE/one.zip TWO/two.zip

Перенаправить вывод в файл, добавив > outfile к команде. Если вы хотите добавить ./, чтобы сделать относительный путь более явным, измените %s на ./%s

$ printf './%s\n' */*.zip > outfile $ cat outfile ./ONE/one.zip ./TWO/two.zip

. Если вы хотите сделать это рекурсивно, тогда bash поддерживает это, если вы включили опцию globstar shell, например

$ cd .. $ shopt -s globstar $ printf '%s\n' **/*.zip FILES/ONE/one.zip FILES/TWO/two.zip

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

2
ответ дан 24 July 2018 в 16:53

Или вы можете сделать это с помощью regex

find /tmp/FILES -regextype posix-egrep -regex ".*/*/*.zip" > outfile.txt

. Вывод одинаков:

./TWO/two.zip ./ONE/one.zip

Проблема в том, что он будет соответствовать всем zip-файлам в любой подпапке , Если вы можете определить подпапки, содержащие файлы, которые вы можете сделать:

find /tmp/FILES -regextype posix-egrep -regex ".*/(ONE|TWO)/*.zip" > outfile.txt
0
ответ дан 24 July 2018 в 17:02

Простая оболочка оболочки может достичь этого. Например, с учетом

$ tree . . ├── ONE │   └── one.zip └── TWO └── two.zip 2 directories, 2 files

, тогда

$ printf '%s\n' */*.zip ONE/one.zip TWO/two.zip

Перенаправить вывод в файл, добавив > outfile к команде. Если вы хотите добавить ./, чтобы сделать относительный путь более явным, измените %s на ./%s

$ printf './%s\n' */*.zip > outfile $ cat outfile ./ONE/one.zip ./TWO/two.zip

. Если вы хотите сделать это рекурсивно, тогда bash поддерживает это, если вы включили опцию globstar shell, например

$ cd .. $ shopt -s globstar $ printf '%s\n' **/*.zip FILES/ONE/one.zip FILES/TWO/two.zip

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

2
ответ дан 24 July 2018 в 17:02

Другие вопросы по тегам:

Похожие вопросы: