web-dev-qa-db-fra.com

mv: target 'Nfilename' n'est pas une aide d'erreur de répertoire

Je suis novice dans Ubuntu et le codage en général, mais je dois l’utiliser pour analyser certaines données de séquençage moléculaire et je suis coincé!

J'ai récemment quitté mon ordinateur portable pour un PC plus puissant (avec à la fois un VM monté) et une partie de mon script ne fonctionne plus.

Le code que j'utilise pour diviser un fichier (Map.txt) en fichiers individuels, puis renommer chaque fichier et enfin ajouter la ligne d'en-tête du fichier d'origine à chaque fichier est le suivant:

$ tail -n +2 Map.txt | split -l 1

$ awk '{cmd="echo " $0 ">" $1; system(cmd)}' x*

$ for file in `ls N*`; do echo "`head -1 Map.txt`" > tmp; cat $file >> tmp; mv –f tmp $file; done

Chaque commande est exécutée individuellement, mais une erreur s’affiche:

mv: target 'NC2B7' is not a directory

quand je lance la troisième commande ci-dessus ($ pour le fichier dans etc). Je ne sais pas trop pourquoi cette commande ne fonctionne tout à coup pas. J'utilisais un vieil Oracle VM VirtualBox sur mon ordinateur portable et maintenant j'utilise Oracle VM VirtualBox v5.2.18 avec Ubuntu 16.04 pour exécuter QIIME. .

Quelqu'un peut-il me dire quelle pourrait en être la cause et/ou quelle devrait être la troisième commande?

1
Imnotacoder

Changement

$ for file in `ls N*`; do echo "`head -1 Map.txt`" > tmp; cat $file >> tmp; mv –f tmp $file; done

à

$ for file in `ls N*`; do echo "`head -1 Map.txt`" > tmp; cat $file >> tmp; mv -f tmp $file; done

La différence n'est pas facile à voir, mais dans votre commande, vous avez utilisé un long tiret au lieu du tiret normal de la commande mv-, -f-. Je l'ai testé et cela a fonctionné.

Pour éviter les accidents avec les noms de fichiers contenant des espaces, vous devez ajouter des guillemets:

$ for file in `ls N*`; do echo "`head -1 Map.txt`" > tmp; cat "$file" >> tmp; mv -f tmp "$file"; done

Vous pouvez également simplifier toute la commande pour

$ for file in N*; do head -1 Map.txt > tmp; cat "$file" >> tmp; mv -f tmp "$file";

qui a été suggéré par @PerlDuck. Bien sûr, j'ai testé cette suggestion avant de l'ajouter à cette réponse.

1
mook765