Un moyen rapide d'inclure un path de directory lors de l'appel mv?

Souvent, je vais travailler à partir de la racine d'un directory de rails où je me retrouve dans le même path deux fois à chaque fois que je voudrais déplacer un file:

mv app/views/layouts/application.html.erb app/views/layouts/application.html.haml 

Le haml est juste l'un des exemples de mai où je dois changer le nom de file sans modifier le directory dans lequel il vit actuellement et sans changer de directory. Y a-t-il un moyen d'y parvenir?

Utilisez l' expansion de l'accolade :

 mv very/long/path/to/filename.{old,new} 

élargirait à

 mv very/long/path/to/filename.old very/long/path/to/filename.new 

Si vous travaillez dans un directory, vous pouvez y accéder temporairement.

 pushd app/views/layouts mv application.html.erb application.html.haml popd 

Sous Linux, vous pouvez utiliser l'utilitaire rename (appelé rename.ul sous Debian, Ubuntu et dérivés) pour modifier une partie du nom de file (qui peut se find dans la partie directory). rename foo bar path/to/file change la première occurrence de foo dans le path/to/file to bar . Si un nom de file ne contient pas la première string, le file est laissé en place.

 rename .erb .haml app/views/layouts/application.html.erb rename .erb .haml app/views/layouts/*.html.erb # do several in one go rename .erb .haml app/views/layouts/application.* # never mind if application.js and application.html.gz also exist 

Lorsque vous avez plusieurs mots consécutifs dans une ligne comman partageant une même racine, vous pouvez utiliser l'expansion d'accolade:

 mv app/views/layouts/application.html.{erb,haml} 

Vous pourriez cd dans le directory dans un sous-shell:

 (cd app/views/layouts && mv application.html.erb application.html.haml) 

Ici, les parenthèses exécutent les commands dans un nouveau process shell bash .

Vous pouvez définir la fonction:

 mv-rename () { mv -- "${1}" "$(dirname -- "${1}")/${2}" } 

Usage:

 mv-rename app/views/layouts/application.html.erb application.html.haml