Как переместить папку в себя?

Я не знаю, что не так с написанным сценарием; использование 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, а не в текущем рабочем каталоге. (Несомненно, существуют более чистые способы сделать это.)

2
18.03.2019, 06:04
4 ответа
$ cd foo
$ mkdir var1
$ mv * var1

El shell y el comando mvson ​​lo suficientemente inteligentes como para no intentar mover el directorio var1 a sí mismo.

5
27.01.2020, 21:49

Cambiaría el nombre del directorio y lo movería dentro de uno nuevo, aproximadamente como lo hizo usted. Para insertar var1/entre fooy 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 foointacto, entonces necesitaremos crear var1de 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 ).

2
27.01.2020, 21:49

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/
6
27.01.2020, 21:49

Puede usar rsyncque 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-listen mi rsync página de manual, ¡pero no obtuve ese trabajo!

Pongo --remove-source-filesentre llaves para ser [advertir] sobre eso.

para eliminar directorios vacíos:

find foo/ -depth -type d -empty -execdir rmdir "{}" \;
1
27.01.2020, 21:49

Теги

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