它必须是一个受欢迎的问题,但我找不到答案。
如何通过*将所有文件移动到包括隐藏文件以及父目录,如下所示:
mv /path/subfolder/* /path/
这会将所有文件移动到父目录,但不会移动隐藏文件。怎么做?
答案 0 :(得分:172)
您可以在UNIX和UNIX中找到一套全面的解决方案。 Linux对How do you move all files (including hidden) from one directory to another?的回答。它显示了Bash,zsh,ksh93,standard(POSIX)sh等的解决方案。
您可以一起使用这两个命令:
mv /path/subfolder/* /path/ # your current approach
mv /path/subfolder/.* /path/ # this one for hidden files
或全部(thanks pfnuesel):
mv /path/subfolder/{.,}* /path/
扩展为:
mv /path/subfolder/* /path/subfolder/.* /path/
(示例:echo a{.,}b
扩展为a.b ab
)
请注意,这会显示一些警告:
mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory
请忽略它们:发生这种情况是因为/path/subfolder/{.,}*
也扩展为/path/subfolder/.
和/path/subfolder/..
,它们是目录和父目录(请参阅What do “.” and “..” mean when in a folder?)。
如果您只想复制,可以使用仅仅:
cp -r /path/subfolder/. /path/
# ^
# note the dot!
这将复制所有正常和隐藏文件,因为/path/subfolder/.
扩展为“此目录中的所有内容”(来源:How to copy with cp to include hidden files and hidden directories and their contents?)
答案 1 :(得分:28)
这将把所有文件移动到父目录,就像预期的那样 不要移动隐藏文件。怎么做?
您可以启用dotglob
:
shopt -s dotglob # This would cause mv below to match hidden files
mv /path/subfolder/* /path/
要关闭dotglob
,您需要说:
shopt -u dotglob
答案 2 :(得分:25)
我认为这是最优雅的,因为它也不会尝试移动..
:
mv /source/path/{.[!.],}* /destination/path
答案 3 :(得分:4)
另一种更简单的解决方案是使用rsync
实用程序:
rsync -vuar --delete-after path/subfolder/ path/
优点是原始文件夹(subfolder
)将被删除以及命令的一部分,在此处使用mv
示例时,您仍需要清理文件夹,更不用说在单一模式中覆盖隐藏和非隐藏文件的额外麻烦。
此外,rsync
支持在远程处理器之间复制/移动文件,并确保文件的复制完全符合原始文件(-a
)。
使用过的-u
参数会跳过现有的较新文件,-r
会递归到目录中,-v
会增加详细程度。
答案 4 :(得分:2)
让我向你介绍我的朋友“dotglob”。无论“*”是否包含隐藏文件,它都会打开和关闭。
$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. .. .den .hi .hidden a b c
$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c
$ shopt -s dotglob
$ ls *
.den .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c
默认为“关闭”。
$ shopt dotglob
dotglob off
最好在完成后再打开它,否则你会混淆那些假设它会被关闭的东西。
答案 5 :(得分:2)
通过将find
命令与mv
命令结合使用,可以防止mv
命令尝试移动目录(例如..
和{{1} })和子目录。这是一个选项:
.
提供的其他一些答案存在问题。例如,以下各项将尝试从源路径移动子目录:
find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;
另外,2)包括。和..文件和3)错过像..foobar,... barfoo等文件
您可以使用1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/
3) mv /source/path/{.[!.],}* /destination/path
,其中包含3个错过的文件,但它仍会尝试移动子目录。如上所述,使用mv /source/path/{.[!.],..?,}* /destination/path
命令和find
命令可以消除所有这些问题。
答案 6 :(得分:1)
当我必须将所有文件(包括.
个文件)复制到目标目录保留权限时,我解决此问题的方法是:(覆盖如果已经存在)
yes | cp -rvp /source/directory /destination/directory/
yes
用于自动覆盖目标文件,
r
递归,
v
详细,
p
保留权限。
请注意,源路径不是以/
结尾(因此会复制所有files /目录和。文件)
目标目录以/
结尾,因为我们将源文件夹的内容作为整体放置到目标。