Вы можете сделать это, используя версии GNU find
и mv
, вот так:
find. -mindepth 2 -maxdepth 2 -type f -execdir mv -vt./folder/. {} +
Где мы ограничиваем find
поиск обычных файлов на 2 уровня в глубину, а затем с помощью опции -execdir
перемещаем выбранный файл (с )в подкаталог folder
, который со -смежным в выбранный файл (s ).
Если ваш ./run
будет выводить свой вывод на стандартный вывод, если не задан файловый аргумент (, который является обычным в Unix/Linux ), тогда вы можете просто использовать:
./run | xz -c >output.txt.xz
Если ему нужен аргумент имени файла, но если запись в канал работает нормально, вы можете использовать либо специальное устройство, такое как /dev/stdout
или/dev/fd/1
(оба должны быть эквивалентны ), например:
./run /dev/stdout | xz -c >output.txt.xz
Или вы можете использовать подстановку процесса , которая обычно доступна в большинстве современных оболочек, таких как bash, zsh или ksh, которая в конечном итоге будет использовать устройство из /dev/fd
за кулисами для выполнения то же:
./run >(xz -c >output.txt.xz)
Этот последний также нуждается в ./run
, чтобы иметь возможность писать в канал, но он должен работать лучше, чем другие, если ./run
записывает вoutput.txt
и в стандартный вывод в своей нормальной работе, в которой случае вывод будет перепутан, если вы перенаправите оба на стандартный вывод.
Программы обычно нормально записывают в канал, но некоторые из них могут захотеть выполнить поиск и перемотать смещения в выходном файле, что невозможно в канале. Если это так, то запись во временный файл, а затем его сжатие, вероятно, все, что вы можете сделать.