Как можно переместить (или копия) все файлы к каталогу с тем же префиксом имени файла?

Можно получить большую информацию о программе путем вызова его под strace. Это показывает каждый системный вызов, что программа делает, который может иногда быть слишком большой информацией, но может быть большой справкой для нахождения то, что идет не так, как надо.

Приблизьтесь нужно запустить Ваше большое приложение под strace. Это, вероятно, произведет большой вывод и замедлит Ваше приложение.

strace -s9999 -efile,process -f -o bigapp.strace bigapp

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

strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345

Если достаточно заметить, что внешний исполняемый файл, то как другое ответы уже предложили, заменяет тот исполняемый файл сценарием обертки. Можно переместить исполняемый файл в другое имя и положить сценарий обертки на его место или поместить сценарий обертки перед обычным исполняемым файлом в PATH, или настройте приложение для вызова сценария обертки вместо обычного исполняемого файла, независимо от того, что удобно. Сделайте тот сценарий обертки

#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "$@"

Объяснение strace параметров использовало:

  • -e выбирает системные вызовы трассировки. Можно указать системные вызовы по имени или использовать несколько категорий такой как file (open, close, read, write, …) и process (fork, execve, …).
  • -f делает strace, следует за ветвлениями, т.е. подпроцессами трассировки, а также исходным процессом.
  • -o выбирает название файла, содержащего трассировку. $$ конструкция оболочки, которая обозначает идентификатор процесса процесса оболочки (из-за использования exec в последнем сценарии обертки, который также будет идентификатором процесса дополнительного приложения).
  • -s9999 заставляет его отобразить это много байтов для read и write и другие вызовы.

9
06.02.2012, 22:45
2 ответа

Это был бы ад для сообщения find что сделать в этом случае.

Лучше используйте оболочку:

for i in **/*.{xrt,ini,moo}; do
  FILE=$(basename "$i")
  DIR=~/dst/${FILE%.*}
  echo mkdir -p -- "$DIR"
  echo mv -i -t "$DIR" -- "$i"
done

Использовать shopt -s globstar сделать ** работа шарика (или использование zsh!). И удалите echos позже, если команда печатает то, что Вы хотите.

10
27.01.2020, 20:06
  • 1
    с помощью удара, это то же? –  qodeninja 06.02.2012, 22:44
  • 2
    @codeninja shopt -s globstar, посмотрите мое редактирование. Если существует только два уровня, можно использовать */*.* и отрывок будет работать в любой оболочке. –  Gilles 'SO- stop being evil' 07.02.2012, 02:40

обман находит командную строку:

find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;

на самом деле работа вокруг для призыва сценария удара находит LOL.

=P

2
27.01.2020, 20:06
  • 1
    , что происходит, если существует файл, который называют … happy rm -rf / ! Этот вид кода заслуживает-1. –  Stéphane Gimenez 07.02.2012, 15:04
  • 2
    Ваше редактирование недостаточно: скажем, Вы нажали на ссылку и загрузили Yay" rm -rf / "Rox0r.avi, снова там похож на проблему … –  Stéphane Gimenez 07.02.2012, 15:22
  • 3
    (И нет никакого способа сделать этот вид замены безопасным). А-ч –  Stéphane Gimenez 07.02.2012, 15:24
  • 4
    , возможно, возможно сделать это по-другому. Кажется что следующие работы: -exec bash -c 'command which uses "$1"' bash '{}' ';'. Ну, это довольно бессмысленно так или иначе. сделанный –  Stéphane Gimenez 07.02.2012, 15:26
  • 5
    @StéphaneGimenez, удар не является единственной вещью использовать. LOL –  yuyichao 07.02.2012, 15:30

Теги

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