Dlaczego niektóre polecenia GNU Coreutils mają taką -T/--no-target-directoryopcję? Wydaje się, że wszystko, co robi, można osiągnąć za pomocą semantyki .(self dot) w tradycyjnej uniksowej hierarchii katalogów.
Wobec:
cp -rT /this/source dir
Ta -Topcja zapobiega tworzeniu dir/sourcepodkatalogu przez kopię . Raczej /this/sourcejest identyfikowany z, dira zawartość jest odpowiednio mapowana między drzewami. Więc na przykład /this/source/foo.cchodzi do dir/foo.ci tak dalej, niż do dir/source/foo.c.
Ale można to łatwo osiągnąć bez -Topcji:
cp -r /this/source/. dir # Probably worked fine since dawn of Unix?
Semantycznie, kropka końcowa jest kopiowana jako dziecko dir, ale oczywiście to „dziecko” już istnieje (więc nie musi być tworzone) i jest w rzeczywistości dirsobą, więc efekt /this/pathjest identyfikowany z dir.
Działa dobrze, jeśli bieżącym katalogiem jest cel:
cp -r /this/tree/node/. . # node's children go to current dir
Czy istnieje coś, co można zrobić tylko z -Tktóre mogą zracjonalizować swoje istnienie? (Poza obsługą systemów operacyjnych, które nie implementują katalogu kropek, uzasadnienie nie zostało wymienione w dokumentacji.)
Czy powyższa sztuczka punktowa nie rozwiązuje tych samych warunków wyścigu, o których mowa w dokumentacji GNU Info -T?
.Trik robi pracę podczas kopiowania pliku, nie tylko podczas zmiany nazwy jego basename w tym samym czasie!cp /path/to/file /target/dir/.Jeśli/target/dir/fileistnieje i jest katalogiem, otrzymasz taką samą diagnostykę! Ale pokazałeś, czego-Tnie da się zrobić bez niego w jednym kroku, bez warunków wyścigu: skopiuj plik i zmień jego nazwę, bez przetaczania go do podkatalogu.