Comment puis-je utiliser le terminal Linux pour copier tout dans le répertoire courant vers un sous-répertoire?
Comment puis-je utiliser le terminal Linux pour copier tout dans le répertoire courant vers un sous-répertoire?
Réponses:
Si vous souhaitez copier le contenu du dossier de manière récursive (générera 1 erreur, alternatives ci-dessous):
cp -r * sub/
Un peu plus hacky, mais fonctionne sur des sous-répertoires non vides:
TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"
Un autre oneliner:
TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done
Ou récursif:
TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done
find
code: D
xargs
ou -exec
. Pas besoin de grep
- utiliser ! -name "$TARGETDIR"
ou similaire. Vous avez des citations inégalées $file
. Je ne pense pas qu'un récursif cp
fonctionnera comme vous le souhaitez, sauf dans votre première commande.
Supposons que target
le nom du sous-répertoire cible, si votre shell est bash:
shopt -s extglob
cp -r !(target) target/
Dans ksh, vous pouvez le faire directement cp -r !(target) target/
.
Dans zsh, vous pouvez le faire setopt ksh_glob
ensuite cp -r !(target) target/
. Une autre possibilité est setopt extended_glob
alors cp -r ^target target/
.
Je suggérerais de déplacer le répertoire cible en dehors du répertoire source, puis de le remettre à nouveau; mv est gratuit (si vous faites attention de ne pas passer à un autre système de fichiers), sauf si vous vous attendez à ce que d'autres processus interfèrent / soient perturbés.
La plupart des solutions publiées ci-dessus ne fonctionneront pas s'il y a des espaces dans les noms de fichiers. Je suggérerais d'utiliser des variantes de find -print0 | xargs -0, ou trouver -exec, etc.
Est-ce que cela fonctionnera pour vous?
cp -r * subdir/
Si vous aviez l'intention de déplacer au lieu de tout copier dans le répertoire courant vers un sous-répertoire, vous pourriez faire:
mv * subdir/
Cela copiera tout, y compris les fichiers dot, et n'incluant pas le répertoire cible lui-même, dans le répertoire cible SUBDIR
:
for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done
Cela va dans le fichier dirCopy.sh
for i in `ls`
do
if [ $i != "subDir" ]
then
`cp -r $i subDir`
fi
done
exécutez-le comme "sh dirCopy.sh" dans votre console
ls
: for file in *
. Pas besoin de backticks - utilisation $()
. Pas besoin de backticks (ou $()
) autour de la cp
commande (cela produira un message d'erreur).