Я не знаю, что не так с написанным сценарием; использование set -x
в качестве второй строки сценария - хорошее начало для отладки, как указал don_crissti. Я недостаточно хорошо знаю xargs и расширение массива, чтобы сразу увидеть, что не так.
Однако есть простой обходной путь, и, вероятно, лучший способ решить эту проблему в любом случае: просто используйте tee
. Он позволяет вам записывать в несколько файлов одной командой и даже позволяет добавлять текст вместо замены содержимого файла (если вы этого хотите).
Если я правильно прочитал ваш сценарий, то, что вы хотите, будет выглядеть примерно так:
#!/bin/bash
NF1=/home/user3/mynewfile
U3=/home/user3/
File=(grades mynewfile mynewfile1 mynewfile2)
mkdir -p /home/user3/{CIT/{tests/,grades/},MyStuff/{Tests/,Labs/},NOS/};
cd ${U3}CIT/tests/
echo /etc/hosts.allow | tee ${File[*]} ${U3}CIT/grades/${File[2]} $NF1
cd -
РЕДАКТИРОВАТЬ: при расширении массива по умолчанию используется разделение пробелов; поэтому я добавил cd
, поэтому файлы mynewfile, mynewfile1, mynewfile2 будут созданы в / home / user3 / CIT / tests, а не в текущем рабочем каталоге. (Несомненно, существуют более чистые способы сделать это.)
$ cd foo
$ mkdir var1
$ mv * var1
El shell y el comando mv
son lo suficientemente inteligentes como para no intentar mover el directorio var1 a sí mismo.
Cambiaría el nombre del directorio y lo movería dentro de uno nuevo, aproximadamente como lo hizo usted. Para insertar var1/
entre foo
y su contenido:
d=$(mktemp -d./tmp.XXXXXX)
mkdir "$d"; mv foo "$d"/var1; mv "$d" foo
Eso funciona para el contenido del directorio. Sin embargo, es un poco más complicado si también consideramos el propietario, los bits de acceso, las ACL, los atributos extendidos, el número de inodo, etc. del directorio.
Si queremos mantener foo
intacto, entonces necesitaremos crear var1
de nuevo y mover los contenidos. Uso de bash:
cd foo
mkdir var1
shopt -s dotglob # to get any dotfiles
mv * var1 # ignore the error about moving var1 to itself
O, para evitar el error, utiliceextglob
:
shopt -s extglob
mv !(var1) var1
Tenga en cuenta que $(ls | grep -v)
no incluirá archivos de puntos, y no funcionará si tiene nombres de archivo con espacios en blanco o líneas nuevas (por dos razones diferentes ).
Simplemente puede crear el directorio var1, mover todos los archivos/carpetas en foo a var1 y finalmente mover var1 dentro de foo
$ mkdir var1
$ mv foo/* var1
$ mv var1 foo/
Puede usar rsync
que creará el directorio de destino (solo el último nivel )si aún no existe, pero esto dará como resultado directorios vacíos que luego eliminará o mantendrá.
rsync -rv [--remove-source-files] foo/* foo/var1
Hay una opción -m, --prune-empty-dirs.
queprune empty directory chains from file-list
en mi rsync página de manual, ¡pero no obtuve ese trabajo!
Pongo --remove-source-files
entre llaves para ser [advertir] sobre eso.
para eliminar directorios vacíos:
find foo/ -depth -type d -empty -execdir rmdir "{}" \;