Эквивалент bash «map»: запустить команду для каждого файла

Добавьте этот код в свой файл css3

** Remove the header from the dataTable**/
.ui-datatable.borderless thead {
  display: none;
}

/** Remove the border from the dataTable **/
.ui-datatable.borderless tbody,
.ui-datatable.borderless tbody tr,
.ui-datatable.borderless tbody td {
    border-style: none;
    }

Затем вызовите этот код из файла xhtml следующим образом:

<p:dataTable styleClass="borderless">
13
задан Claudiu 14 April 2010 в 19:25
поделиться

10 ответов

Если вы просто пытаетесь выполнить свою программу data для группы файлов, самый простой / наименее сложный способ - использовать -exec в найти .

Допустим, вы хотите выполнить data для всех текстовых файлов в текущем каталоге (и подкаталогах). Это все, что вам нужно:

find . -name "*.txt" -exec data {} \;

Если вы хотите ограничить его текущим каталогом, вы можете сделать это:

find . -maxdepth 1 -name "*.txt" -exec data {} \;

Есть много вариантов с find .

15
ответ дан 1 December 2019 в 17:58
поделиться

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

#!/bin/bash
cd /path/to/your/dir
for file in `dir -d *` ; do
  ./data "$file"
done

Он просматривает каждый файл в / path / to / your / dir и запускает на нем ваш сценарий "data". Обязательно выполните chmod приведенный выше сценарий, чтобы он стал исполняемым.

0
ответ дан 1 December 2019 в 17:58
поделиться

Вы также можете использовать PRLL .

0
ответ дан 1 December 2019 в 17:58
поделиться

ls не обрабатывает пробелы, переводы строки и другие неприятные вещи в именах файлов, и ее следует по возможности избегать.

find полезен только в том случае, если вы хотите погрузиться в подкаталоги или если вы хотите использовать другие параметры (mtime, size, вы называете это).

Но многие команды обрабатывают несколько файлов самостоятельно, поэтому цикл for не нужен:

for d in * ; do du -s $d; done

но

du -s *
md5sum e* 
identify *jpg
grep bash ../*.sh
0
ответ дан 1 December 2019 в 17:58
поделиться

Вам следует избегать синтаксического анализа ls :

find . -maxdepth 1 | while read -r file; do do_something_with "$file"; done

или

while read -r file; do do_something_with "$file"; done < <(find . -maxdepth 1)

Последний не создает подоболочку из цикла while.

5
ответ дан 1 December 2019 в 17:58
поделиться

Распространенные методы:

ls * | while read file; do data "$file"; done

for file in *; do data "$file"; done

Второй может вызвать проблемы, если у вас есть пробелы в именах файлов; в этом случае вы, вероятно, захотите убедиться, что он работает в подоболочке, и установите IFS:

( IFS=$'\n'; for file in *; do data "$file"; done )

Вы можете легко обернуть первый сценарий в сценарий:

#!/bin/bash
# map.bash

while read file; do
    "$1" "$file"
done

, который может быть выполнен по вашему запросу - просто будьте осторожны никогда случайно не выполнить с ним ничего глупого. Преимущество использования циклической конструкции заключается в том, что вы можете легко разместить внутри нее несколько команд как часть однострочника, в отличие от xargs, где вам придется поместить их в исполняемый скрипт для его запуска.

Конечно, вы также можете просто использовать утилиту xargs :

find -maxdepth 0 * | xargs -n 1 data

Обратите внимание, что вы должны убедиться, что индикаторы выключены ( ls --indicator-style = none ) если вы обычно их используете, либо @ , добавленное к символическим ссылкам, превратит их в несуществующие имена файлов.

3
ответ дан 1 December 2019 в 17:58
поделиться

Похоже, вы хотите xargs:

find . --maxdepth 1 | xargs -d'\n' data

Чтобы сначала вывести каждую команду, это становится немного сложнее:

find . --maxdepth 1 | xargs -d'\n' -I {} bash -c "echo {}; data {}"
7
ответ дан 1 December 2019 в 17:58
поделиться

Если вы просто хотите выполнить команду для каждого файла, вы можете сделать следующее:

for i in *; do data "$i"; done

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

for i in *; do echo -n "$i: "; data "$i"; done
8
ответ дан 1 December 2019 в 17:58
поделиться

Попробуйте так:

for i in *; do echo ${i}: `data $i`; done
1
ответ дан 1 December 2019 в 17:58
поделиться

Поскольку вы специально спросили об этом Что касается "карты", я подумал, что поделюсь этой функцией в моей личной библиотеке оболочки:

# map_lines: evaluate a command for each line of input
map_lines()
{
        while read line ; do
                $1 $line
        done
}

Я использую ее так же, как вы для решения:

$ ls | map_lines ./data

Я назвал ее map_lines вместо map, как я Предполагается, что когда-нибудь я смогу реализовать map_args там, где вы будете использовать его следующим образом:

$ map_args ./data *

Эта функция будет выглядеть так:

map_args()
{
    cmd="$1" ; shift
    for arg ; do
        $cmd "$arg"
    done
}
2
ответ дан 1 December 2019 в 17:58
поделиться