#include #include #include #include #include #include #include int move(const char *src, const char *dst) { char *copy = strdup(src); if (!copy) return 1; char *bname = basename(copy); size_t len = strlen(dst) + strlen(bname) + 2; char *new_path = malloc(len + 1); if (new_path == NULL) return 1; snprintf(new_path, len, "%s/%s", dst, bname); int ret = 0; if (rename(src, new_path) < 0) ret = 1; free(new_path); free(copy); return ret; } int main(const int argc, const char **argv) { if (argc <= 2 || !strcmp(argv[argc - 1], "--help")) { printf("mv [Src1 src2...] [Dst]\n"); return 0; } for (int i = 1; i < argc - 1; i++) { if (rename(argv[i], argv[argc - 1]) < 0) { if (move(argv[i], argv[argc - 1])) { fprintf(stderr, "mv: %s %s\n", argv[i], strerror(errno)); return 1; } } } return 0; }