Приложение для создания файлов и папок из данной структуры

Вы можете использовать следующий однострочный:

cut -f1 fileA | grep -f - fileB > fileC
команда cut будет извлекать первый столбец из fileA (при условии разделения вкладок. используйте -d, чтобы указать что-то еще) команда grep выводит вывод cut и выполняет поиск fileB для всех строк. выход будет записан в fileC
1
задан 18 June 2012 в 22:27

5 ответов

Сложная часть состоит в том, что у вас есть файлы и папки, показанные одинаково, и нет простого способа рассказать им обособленно. Для файла 2.1 нет способа определить, действительно ли он (/folder2/folder2.1/file2.1) является папкой или файлом в папке2.1.

Да, ваше описание говорит слово *file*, поэтому мы знаем, что вы имеете в виду файл, но в программу, как он мог сказать? Программа может сообщать файлы из путей, потому что за одним и тем же уровнем отступов используется другая запись. НО, это приводит к множеству сложных и запутывающих правил.

Я бы предложил вам использовать ключевое слово или только полные квалифицированные имена. Самый простой способ:

/ folder1 /

/ folder2 /

/ folder2 / file1

/ folder2 / folder2. 1 /

/folder2/folder2.1/file2.1

Конечная косая черта означает «Это папка, а не файл». Тогда вы можете создать простой сценарий, чтобы создать свою структуру каталогов. Пара предупреждений об этом скрипте.

  1. сначала должны быть созданы каталоги более высокого уровня.
  2. Я добавляю «.». к пути, так что все созданные каталоги относятся к тому, в котором выполняется сценарий.
  3. Я не проверяю ошибки для содержимого файла каталога / пути.
< 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 будет генерировать ваши каталоги и файлы, как описано в файле данных.

1
ответ дан 25 July 2018 в 20:26

Сложная часть состоит в том, что у вас есть файлы и папки, показанные одинаково, и нет простого способа рассказать им обособленно. Для файла 2.1 нет способа определить, действительно ли он (/folder2/folder2.1/file2.1) является папкой или файлом в папке2.1.

Да, ваше описание говорит слово *file*, поэтому мы знаем, что вы имеете в виду файл, но в программу, как он мог сказать? Программа может сообщать файлы из путей, потому что за одним и тем же уровнем отступов используется другая запись. НО, это приводит к множеству сложных и запутывающих правил.

Я бы предложил вам использовать ключевое слово или только полные квалифицированные имена. Самый простой способ:

/ folder1 /

/ folder2 /

/ folder2 / file1

/ folder2 / folder2. 1 /

/folder2/folder2.1/file2.1

Конечная косая черта означает «Это папка, а не файл». Тогда вы можете создать простой сценарий, чтобы создать свою структуру каталогов. Пара предупреждений об этом скрипте.

  1. сначала должны быть созданы каталоги более высокого уровня.
  2. Я добавляю «.». к пути, так что все созданные каталоги относятся к тому, в котором выполняется сценарий.
  3. Я не проверяю ошибки для содержимого файла каталога / пути.
< 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 будет генерировать ваши каталоги и файлы, как описано в файле данных.

1
ответ дан 2 August 2018 в 02:17

Сложная часть состоит в том, что у вас есть файлы и папки, показанные одинаково, и нет простого способа рассказать им обособленно. Для файла 2.1 нет способа определить, действительно ли он (/folder2/folder2.1/file2.1) является папкой или файлом в папке2.1.

Да, ваше описание говорит слово *file*, поэтому мы знаем, что вы имеете в виду файл, но в программу, как он мог сказать? Программа может сообщать файлы из путей, потому что за одним и тем же уровнем отступов используется другая запись. НО, это приводит к множеству сложных и запутывающих правил.

Я бы предложил вам использовать ключевое слово или только полные квалифицированные имена. Самый простой способ:

/ folder1 /

/ folder2 /

/ folder2 / file1

/ folder2 / folder2. 1 /

/folder2/folder2.1/file2.1

Конечная косая черта означает «Это папка, а не файл». Тогда вы можете создать простой сценарий, чтобы создать свою структуру каталогов. Пара предупреждений об этом скрипте.

  1. сначала должны быть созданы каталоги более высокого уровня.
  2. Я добавляю «.». к пути, так что все созданные каталоги относятся к тому, в котором выполняется сценарий.
  3. Я не проверяю ошибки для содержимого файла каталога / пути.
< 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 будет генерировать ваши каталоги и файлы, как описано в файле данных.

1
ответ дан 6 August 2018 в 02:31

Сложная часть состоит в том, что у вас есть файлы и папки, показанные одинаково, и нет простого способа рассказать им обособленно. Для файла 2.1 нет способа определить, действительно ли он (/folder2/folder2.1/file2.1) является папкой или файлом в папке2.1.

Да, ваше описание говорит слово *file*, поэтому мы знаем, что вы имеете в виду файл, но в программу, как он мог сказать? Программа может сообщать файлы из путей, потому что за одним и тем же уровнем отступов используется другая запись. НО, это приводит к множеству сложных и запутывающих правил.

Я бы предложил вам использовать ключевое слово или только полные квалифицированные имена. Самый простой способ:

/ folder1 /

/ folder2 /

/ folder2 / file1

/ folder2 / folder2. 1 /

/folder2/folder2.1/file2.1

Конечная косая черта означает «Это папка, а не файл». Тогда вы можете создать простой сценарий, чтобы создать свою структуру каталогов. Пара предупреждений об этом скрипте.

  1. сначала должны быть созданы каталоги более высокого уровня.
  2. Я добавляю «.». к пути, так что все созданные каталоги относятся к тому, в котором выполняется сценарий.
  3. Я не проверяю ошибки для содержимого файла каталога / пути.
< 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 будет генерировать ваши каталоги и файлы, как описано в файле данных.

1
ответ дан 10 August 2018 в 08:30

Сложная часть состоит в том, что у вас есть файлы и папки, показанные одинаково, и нет простого способа рассказать им обособленно. Для файла 2.1 нет способа определить, действительно ли он (/folder2/folder2.1/file2.1) является папкой или файлом в папке2.1.

Да, ваше описание говорит слово *file*, поэтому мы знаем, что вы имеете в виду файл, но в программу, как он мог сказать? Программа может сообщать файлы из путей, потому что за одним и тем же уровнем отступов используется другая запись. НО, это приводит к множеству сложных и запутывающих правил.

Я бы предложил вам использовать ключевое слово или только полные квалифицированные имена. Самый простой способ:

/ folder1 /

/ folder2 /

/ folder2 / file1

/ folder2 / folder2. 1 /

/folder2/folder2.1/file2.1

Конечная косая черта означает «Это папка, а не файл». Тогда вы можете создать простой сценарий, чтобы создать свою структуру каталогов. Пара предупреждений об этом скрипте.

  1. сначала должны быть созданы каталоги более высокого уровня.
  2. Я добавляю «.». к пути, так что все созданные каталоги относятся к тому, в котором выполняется сценарий.
  3. Я не проверяю ошибки для содержимого файла каталога / пути.
< 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 будет генерировать ваши каталоги и файлы, как описано в файле данных.

1
ответ дан 15 August 2018 в 20:36

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

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