Вы можете использовать следующий однострочный:
cut -f1 fileA | grep -f - fileB > fileC
команда cut будет извлекать первый столбец из fileA (при условии разделения вкладок. используйте -d, чтобы указать что-то еще) команда grep выводит вывод cut и выполняет поиск fileB для всех строк. выход будет записан в fileC Сложная часть состоит в том, что у вас есть файлы и папки, показанные одинаково, и нет простого способа рассказать им обособленно. Для файла 2.1 нет способа определить, действительно ли он (/folder2/folder2.1/file2.1
) является папкой или файлом в папке2.1.
Да, ваше описание говорит слово *file*
, поэтому мы знаем, что вы имеете в виду файл, но в программу, как он мог сказать? Программа может сообщать файлы из путей, потому что за одним и тем же уровнем отступов используется другая запись. НО, это приводит к множеству сложных и запутывающих правил.
Я бы предложил вам использовать ключевое слово или только полные квалифицированные имена. Самый простой способ:
/ folder1 /
/ folder2 /
/ folder2 / file1
/ folder2 / folder2. 1 /
/folder2/folder2.1/file2.1
blockquote>Конечная косая черта означает «Это папка, а не файл». Тогда вы можете создать простой сценарий, чтобы создать свою структуру каталогов. Пара предупреждений об этом скрипте.
< blockquote>
- сначала должны быть созданы каталоги более высокого уровня.
- Я добавляю «.». к пути, так что все созданные каталоги относятся к тому, в котором выполняется сценарий.
- Я не проверяю ошибки для содержимого файла каталога / пути.
blockquote>#!/bin/sh -v # # builds a directory and file structure. # directories must exists before referenced or file in the directory declared. # # sample input looks like (without the leading #): # /folder1/ # /folder2/ # /folder2/file1 # /folder2/folder2.1/ # /folder2/folder2.1/file2.1 # # make sure we have our one and only input parameter. if [ $# != 1 ]; then echo "Usage: `basename $0` input_file_name" echo "input_file_name contains absolute dir paths with a trailing slash," echo "or absolute file path/name with no trailing slash." exit 1 fi # get the file name from the command line FILE=$1 # make sure the input parameter specifies a file. if [ ! -e ${FILE} ]; then echo "Sorry, the file ${FILE} does not exist." exit 1 fi for LINE in $(cat $FILE) do LAST=$(echo ${LINE} | awk -F/ '{print $(NF)}') # if file ends with a slash, this value is blank, if it is no slash, this is the file name. if [ "${LAST}XXX" = "XXX" ]; then # is empty, so it is directory, future feature to check exist already mkdir ".${LINE}" else # is not empty, so it is a file touch ".${LINE}" fi done exit 0
Это создаст каталоги и файлы, как показано в входном файле. Если скрипт вызывается
create.sh
, и у вас естьchmod 755 create.sh
, тогда команда./create.sh data
будет генерировать ваши каталоги и файлы, как описано в файле данных.
Сложная часть состоит в том, что у вас есть файлы и папки, показанные одинаково, и нет простого способа рассказать им обособленно. Для файла 2.1 нет способа определить, действительно ли он (/folder2/folder2.1/file2.1
) является папкой или файлом в папке2.1.
Да, ваше описание говорит слово *file*
, поэтому мы знаем, что вы имеете в виду файл, но в программу, как он мог сказать? Программа может сообщать файлы из путей, потому что за одним и тем же уровнем отступов используется другая запись. НО, это приводит к множеству сложных и запутывающих правил.
Я бы предложил вам использовать ключевое слово или только полные квалифицированные имена. Самый простой способ:
/ folder1 /
/ folder2 /
/ folder2 / file1
/ folder2 / folder2. 1 /
/folder2/folder2.1/file2.1
blockquote>Конечная косая черта означает «Это папка, а не файл». Тогда вы можете создать простой сценарий, чтобы создать свою структуру каталогов. Пара предупреждений об этом скрипте.
< blockquote>
- сначала должны быть созданы каталоги более высокого уровня.
- Я добавляю «.». к пути, так что все созданные каталоги относятся к тому, в котором выполняется сценарий.
- Я не проверяю ошибки для содержимого файла каталога / пути.
blockquote>#!/bin/sh -v # # builds a directory and file structure. # directories must exists before referenced or file in the directory declared. # # sample input looks like (without the leading #): # /folder1/ # /folder2/ # /folder2/file1 # /folder2/folder2.1/ # /folder2/folder2.1/file2.1 # # make sure we have our one and only input parameter. if [ $# != 1 ]; then echo "Usage: `basename $0` input_file_name" echo "input_file_name contains absolute dir paths with a trailing slash," echo "or absolute file path/name with no trailing slash." exit 1 fi # get the file name from the command line FILE=$1 # make sure the input parameter specifies a file. if [ ! -e ${FILE} ]; then echo "Sorry, the file ${FILE} does not exist." exit 1 fi for LINE in $(cat $FILE) do LAST=$(echo ${LINE} | awk -F/ '{print $(NF)}') # if file ends with a slash, this value is blank, if it is no slash, this is the file name. if [ "${LAST}XXX" = "XXX" ]; then # is empty, so it is directory, future feature to check exist already mkdir ".${LINE}" else # is not empty, so it is a file touch ".${LINE}" fi done exit 0
Это создаст каталоги и файлы, как показано в входном файле. Если скрипт вызывается
create.sh
, и у вас естьchmod 755 create.sh
, тогда команда./create.sh data
будет генерировать ваши каталоги и файлы, как описано в файле данных.
Сложная часть состоит в том, что у вас есть файлы и папки, показанные одинаково, и нет простого способа рассказать им обособленно. Для файла 2.1 нет способа определить, действительно ли он (/folder2/folder2.1/file2.1
) является папкой или файлом в папке2.1.
Да, ваше описание говорит слово *file*
, поэтому мы знаем, что вы имеете в виду файл, но в программу, как он мог сказать? Программа может сообщать файлы из путей, потому что за одним и тем же уровнем отступов используется другая запись. НО, это приводит к множеству сложных и запутывающих правил.
Я бы предложил вам использовать ключевое слово или только полные квалифицированные имена. Самый простой способ:
/ folder1 /
/ folder2 /
/ folder2 / file1
/ folder2 / folder2. 1 /
/folder2/folder2.1/file2.1
blockquote>Конечная косая черта означает «Это папка, а не файл». Тогда вы можете создать простой сценарий, чтобы создать свою структуру каталогов. Пара предупреждений об этом скрипте.
< blockquote>
- сначала должны быть созданы каталоги более высокого уровня.
- Я добавляю «.». к пути, так что все созданные каталоги относятся к тому, в котором выполняется сценарий.
- Я не проверяю ошибки для содержимого файла каталога / пути.
blockquote>#!/bin/sh -v # # builds a directory and file structure. # directories must exists before referenced or file in the directory declared. # # sample input looks like (without the leading #): # /folder1/ # /folder2/ # /folder2/file1 # /folder2/folder2.1/ # /folder2/folder2.1/file2.1 # # make sure we have our one and only input parameter. if [ $# != 1 ]; then echo "Usage: `basename $0` input_file_name" echo "input_file_name contains absolute dir paths with a trailing slash," echo "or absolute file path/name with no trailing slash." exit 1 fi # get the file name from the command line FILE=$1 # make sure the input parameter specifies a file. if [ ! -e ${FILE} ]; then echo "Sorry, the file ${FILE} does not exist." exit 1 fi for LINE in $(cat $FILE) do LAST=$(echo ${LINE} | awk -F/ '{print $(NF)}') # if file ends with a slash, this value is blank, if it is no slash, this is the file name. if [ "${LAST}XXX" = "XXX" ]; then # is empty, so it is directory, future feature to check exist already mkdir ".${LINE}" else # is not empty, so it is a file touch ".${LINE}" fi done exit 0
Это создаст каталоги и файлы, как показано в входном файле. Если скрипт вызывается
create.sh
, и у вас естьchmod 755 create.sh
, тогда команда./create.sh data
будет генерировать ваши каталоги и файлы, как описано в файле данных.
Сложная часть состоит в том, что у вас есть файлы и папки, показанные одинаково, и нет простого способа рассказать им обособленно. Для файла 2.1 нет способа определить, действительно ли он (/folder2/folder2.1/file2.1
) является папкой или файлом в папке2.1.
Да, ваше описание говорит слово *file*
, поэтому мы знаем, что вы имеете в виду файл, но в программу, как он мог сказать? Программа может сообщать файлы из путей, потому что за одним и тем же уровнем отступов используется другая запись. НО, это приводит к множеству сложных и запутывающих правил.
Я бы предложил вам использовать ключевое слово или только полные квалифицированные имена. Самый простой способ:
/ folder1 /
/ folder2 /
/ folder2 / file1
/ folder2 / folder2. 1 /
/folder2/folder2.1/file2.1
blockquote>Конечная косая черта означает «Это папка, а не файл». Тогда вы можете создать простой сценарий, чтобы создать свою структуру каталогов. Пара предупреждений об этом скрипте.
< blockquote>
- сначала должны быть созданы каталоги более высокого уровня.
- Я добавляю «.». к пути, так что все созданные каталоги относятся к тому, в котором выполняется сценарий.
- Я не проверяю ошибки для содержимого файла каталога / пути.
blockquote>#!/bin/sh -v # # builds a directory and file structure. # directories must exists before referenced or file in the directory declared. # # sample input looks like (without the leading #): # /folder1/ # /folder2/ # /folder2/file1 # /folder2/folder2.1/ # /folder2/folder2.1/file2.1 # # make sure we have our one and only input parameter. if [ $# != 1 ]; then echo "Usage: `basename $0` input_file_name" echo "input_file_name contains absolute dir paths with a trailing slash," echo "or absolute file path/name with no trailing slash." exit 1 fi # get the file name from the command line FILE=$1 # make sure the input parameter specifies a file. if [ ! -e ${FILE} ]; then echo "Sorry, the file ${FILE} does not exist." exit 1 fi for LINE in $(cat $FILE) do LAST=$(echo ${LINE} | awk -F/ '{print $(NF)}') # if file ends with a slash, this value is blank, if it is no slash, this is the file name. if [ "${LAST}XXX" = "XXX" ]; then # is empty, so it is directory, future feature to check exist already mkdir ".${LINE}" else # is not empty, so it is a file touch ".${LINE}" fi done exit 0
Это создаст каталоги и файлы, как показано в входном файле. Если скрипт вызывается
create.sh
, и у вас естьchmod 755 create.sh
, тогда команда./create.sh data
будет генерировать ваши каталоги и файлы, как описано в файле данных.
Сложная часть состоит в том, что у вас есть файлы и папки, показанные одинаково, и нет простого способа рассказать им обособленно. Для файла 2.1 нет способа определить, действительно ли он (/folder2/folder2.1/file2.1
) является папкой или файлом в папке2.1.
Да, ваше описание говорит слово *file*
, поэтому мы знаем, что вы имеете в виду файл, но в программу, как он мог сказать? Программа может сообщать файлы из путей, потому что за одним и тем же уровнем отступов используется другая запись. НО, это приводит к множеству сложных и запутывающих правил.
Я бы предложил вам использовать ключевое слово или только полные квалифицированные имена. Самый простой способ:
/ folder1 /
/ folder2 /
/ folder2 / file1
/ folder2 / folder2. 1 /
/folder2/folder2.1/file2.1
blockquote>Конечная косая черта означает «Это папка, а не файл». Тогда вы можете создать простой сценарий, чтобы создать свою структуру каталогов. Пара предупреждений об этом скрипте.
< blockquote>
- сначала должны быть созданы каталоги более высокого уровня.
- Я добавляю «.». к пути, так что все созданные каталоги относятся к тому, в котором выполняется сценарий.
- Я не проверяю ошибки для содержимого файла каталога / пути.
blockquote>#!/bin/sh -v # # builds a directory and file structure. # directories must exists before referenced or file in the directory declared. # # sample input looks like (without the leading #): # /folder1/ # /folder2/ # /folder2/file1 # /folder2/folder2.1/ # /folder2/folder2.1/file2.1 # # make sure we have our one and only input parameter. if [ $# != 1 ]; then echo "Usage: `basename $0` input_file_name" echo "input_file_name contains absolute dir paths with a trailing slash," echo "or absolute file path/name with no trailing slash." exit 1 fi # get the file name from the command line FILE=$1 # make sure the input parameter specifies a file. if [ ! -e ${FILE} ]; then echo "Sorry, the file ${FILE} does not exist." exit 1 fi for LINE in $(cat $FILE) do LAST=$(echo ${LINE} | awk -F/ '{print $(NF)}') # if file ends with a slash, this value is blank, if it is no slash, this is the file name. if [ "${LAST}XXX" = "XXX" ]; then # is empty, so it is directory, future feature to check exist already mkdir ".${LINE}" else # is not empty, so it is a file touch ".${LINE}" fi done exit 0
Это создаст каталоги и файлы, как показано в входном файле. Если скрипт вызывается
create.sh
, и у вас естьchmod 755 create.sh
, тогда команда./create.sh data
будет генерировать ваши каталоги и файлы, как описано в файле данных.