使用文件夹中存在的文件名创建文件夹,然后将这些文件移动到每个文件夹中
Create folders with names of files present in folder then move those files in each of that folder
我在 abc
文件夹中有不同的文件(每个文件的扩展名不同),我想根据该文件夹中存在的文件名创建文件夹,并将这些文件移动到相应的文件夹中。
例如:
文件夹 abc
有
2.0261fc5a.js.1
22b8a.0cb8dc71bas.map
318a.fa1253sdfde99265.js.map.1
s3ds.asdasg.asfgsf.afasdf.sd
具有唯一名称的文件。
我要创作
2.0261fc5a.js.1
文件夹并将 2.0261fc5a.js.1
文件移动到该文件夹
同样,这应该发生在所有文件上。
我做了一些研究并找到了这个解决方案。
tmp=`mktemp -d tmp_XXXXXX` || exit 1
for i in *
do
mv "$i" $tmp
done
mv $tmp/* .
rm -r $tmp
但这给出了错误
mv: cannot move 'tmp_RwK2xZ' to a subdirectory of itself, 'tmp_RwK2xZ/tmp_RwK2xZ'
你们能帮忙解决一下吗?
我会使用 tmp file 而不是 tmp dir
tmpfile=$(mktemp) # TODO, check this exists on the same filesystem,
# or provide a template argument
for file in *; do
if [[ $file != "$tmpfile" ]]; then
mv "$file" "$tmpfile"
mkdir "$file" # TODO check for failure
mv "$tmpfile" "$file/$file"
fi
done
剩下的事情:错误消息和 re-renaming 文件,如果出现问题。
您可以使用 find
也许:
find . -type f -maxdepth 1 -exec mv {} {}_temp \; -exec mkdir {} \; -execdir mv {}_temp {}/{} \;
基本上这个命令对名为 abc
:
的文件做了什么
mv ./abc ./abc_temp
mkdir ./abc
mv ./abc_temp ./abc/./abc
通过添加 _temp
重命名文件,创建一个与原始文件同名的目录,最后将临时文件重命名回该目录。
对于当前目录中的每个元素fname:
- 如果该元素是一个文件:
if [ -f $fname ]
- 暂时将文件移动到
/tmp
:mv $fname /tmp
- 创建与fname同名的目录:
mkdir $fname
- 将 fname 移动到该目录中:
mv /tmp/$fname ./$fname/
for fname in *
do
if [ -f "$fname" ]
then
mv "$fname" /tmp
mkdir "$fname"
mv "/tmp/$fname" "./$fname/"
fi
done
为什么到处都是双引号?
空间,空间,空间。有时文件名有空格。这使得 problems。双引号是解决方案。
什么是/tmp
我们将文件从当前目录移动到临时目录,这样它就不会与我们即将创建的同名文件夹冲突。我们不必创建新文件或文件夹来存储任何内容,因为 linux /tmp 的存在正是为了这个目的。临时存储随机的东西:)
我在 abc
文件夹中有不同的文件(每个文件的扩展名不同),我想根据该文件夹中存在的文件名创建文件夹,并将这些文件移动到相应的文件夹中。
例如:
文件夹 abc
有
2.0261fc5a.js.1
22b8a.0cb8dc71bas.map
318a.fa1253sdfde99265.js.map.1
s3ds.asdasg.asfgsf.afasdf.sd
具有唯一名称的文件。
我要创作
2.0261fc5a.js.1
文件夹并将 2.0261fc5a.js.1
文件移动到该文件夹
同样,这应该发生在所有文件上。
我做了一些研究并找到了这个解决方案。
tmp=`mktemp -d tmp_XXXXXX` || exit 1
for i in *
do
mv "$i" $tmp
done
mv $tmp/* .
rm -r $tmp
但这给出了错误
mv: cannot move 'tmp_RwK2xZ' to a subdirectory of itself, 'tmp_RwK2xZ/tmp_RwK2xZ'
你们能帮忙解决一下吗?
我会使用 tmp file 而不是 tmp dir
tmpfile=$(mktemp) # TODO, check this exists on the same filesystem,
# or provide a template argument
for file in *; do
if [[ $file != "$tmpfile" ]]; then
mv "$file" "$tmpfile"
mkdir "$file" # TODO check for failure
mv "$tmpfile" "$file/$file"
fi
done
剩下的事情:错误消息和 re-renaming 文件,如果出现问题。
您可以使用 find
也许:
find . -type f -maxdepth 1 -exec mv {} {}_temp \; -exec mkdir {} \; -execdir mv {}_temp {}/{} \;
基本上这个命令对名为 abc
:
mv ./abc ./abc_temp
mkdir ./abc
mv ./abc_temp ./abc/./abc
通过添加 _temp
重命名文件,创建一个与原始文件同名的目录,最后将临时文件重命名回该目录。
对于当前目录中的每个元素fname:
- 如果该元素是一个文件:
if [ -f $fname ]
- 暂时将文件移动到
/tmp
:mv $fname /tmp
- 创建与fname同名的目录:
mkdir $fname
- 将 fname 移动到该目录中:
mv /tmp/$fname ./$fname/
for fname in *
do
if [ -f "$fname" ]
then
mv "$fname" /tmp
mkdir "$fname"
mv "/tmp/$fname" "./$fname/"
fi
done
为什么到处都是双引号?
空间,空间,空间。有时文件名有空格。这使得 problems。双引号是解决方案。
什么是/tmp
我们将文件从当前目录移动到临时目录,这样它就不会与我们即将创建的同名文件夹冲突。我们不必创建新文件或文件夹来存储任何内容,因为 linux /tmp 的存在正是为了这个目的。临时存储随机的东西:)