Linux在目录之前重命名文件
我有以下命令,可以运行到小写文件/目录,replace。使用u和各种其他操作。它的问题是,它似乎试图先重命名目录,然后却找不到下面的文件。有没有一种方法可以先重命名目录中的所有文件,然后再递归地重命名目录本身?e、 gLinux在目录之前重命名文件,linux,rename,file-rename,Linux,Rename,File Rename,我有以下命令,可以运行到小写文件/目录,replace。使用u和各种其他操作。它的问题是,它似乎试图先重命名目录,然后却找不到下面的文件。有没有一种方法可以先重命名目录中的所有文件,然后再递归地重命名目录本身?e、 g 目录1 文件1 文件2 目录1 文件1 文件2 目录2 文件1 目录2 文件1 文件2 我的代码是 while IFS= read -rd '' entry; do entry="${entry#./}" # strip ./ if
- 目录1
- 文件1
- 文件2
- 目录1
- 文件1
- 文件2
- 目录2
- 文件1
- 目录2
- 文件1
- 文件2
while IFS= read -rd '' entry; do
entry="${entry#./}" # strip ./
if [[ -d $entry ]]; then
rename 'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
else
rename 'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
fi
done < <(find . -iname '*' -print0)
而IFS=read-rd''条目;做
entry=“${entry#./}”#条带/
如果[-d$分录]];然后
重命名为“y/A-Z/A-Z/;s//ug/g;s/-/-/g;s/sometext//g;s/_extras/-extras/g“$entry”
其他的
重命名为“y/A-Z/A-Z/;s/\.(?=.*\.)/\uG;s//ug/g;s/-/-/g;s/sometext//g;s/_extras/-extras/g“$entry”
fi
完成<以下是使用递归的未测试代码示例:
recurse()
{
for entry in "$1"/*; do
entry="${entry#./}" # strip ./
if [[ -d $entry ]]; then
recurse $entry
rename 'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
else
rename 'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
fi
done
}
recurse "/home"
下面是使用递归的未测试代码示例:
recurse()
{
for entry in "$1"/*; do
entry="${entry#./}" # strip ./
if [[ -d $entry ]]; then
recurse $entry
rename 'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
else
rename 'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
fi
done
}
recurse "/home"
你看过吗
您的场景更复杂,但看起来他们在处理递归方面遇到了同样的困难。您看过吗
您的场景更为复杂,但看起来他们在处理递归方面遇到了同样的困难。我在思考以下问题:
find /path |awk -F/ '{print NF,$0}' |sort -r -n -k 1 |cut -f2- -d' ' |\
while IFS= read -rd '' entry; do
# ...
done
其思想是在每一行前面加上/
的编号,并根据此字段反向排序:
4/path/dir1/file1
4/path/dir2/file2
3/路径/dir1
3/路径/dir2
2/路径
然后切掉第一列。通过这种方式,您可以自下而上处理条目,以避免重命名问题。我一直在思考以下问题:
find /path |awk -F/ '{print NF,$0}' |sort -r -n -k 1 |cut -f2- -d' ' |\
while IFS= read -rd '' entry; do
# ...
done
其思想是在每一行前面加上/
的编号,并根据此字段反向排序:
4/path/dir1/file1
4/path/dir2/file2
3/路径/dir1
3/路径/dir2
2/路径
然后切掉第一列。通过这种方式,您可以自下而上处理条目,以避免重命名问题。您需要使用递归在一次操作中实现这一点,或者先重命名文件,然后目录我将使用find
创建一个列表,并根据目录/文件深度对其进行自下而上排序。您需要使用递归在一次操作中实现这一点,或者仅重命名文件首先,目录我将使用find
创建一个列表,并根据目录/文件深度自下而上进行排序。这看起来应该可以工作,但当我尝试处理文件/目录时,我会收到一个错误,说“Filename too long:”。我可能会补充说,我正在使用bash for Windows(Ubuntu)并在NTFS磁盘上运行该命令,如果这与它来自何处有任何不同,请重命名?是的,我认为是这样,因为如果我运行该命令,它工作得很好|awk-F/'{print NF,$0}'| sort-r-n-k1 | cut-f2--d''| \entry=“${entry#./}”#strip./if[-d$entry];然后echo$entry else echo$entry fi done您可以使用dirname
和basename
拆分条目,如dirname=$(dirname“$entry”)
,然后pushd“$dirname”;重命名$rules“$basename”;popd
。这看起来应该可以工作,但当我尝试处理文件/目录时,会出现一个错误,显示“文件名太长:”。我可能会补充说,我正在使用bash for Windows(Ubuntu)并在NTFS磁盘上运行该命令,如果这与它来自何处有任何不同,请重命名?是的,我认为是这样,因为如果我运行该命令,它工作得很好|awk-F/'{print NF,$0}'| sort-r-n-k1 | cut-f2--d''| \entry=“${entry#./}”#strip./if[-d$entry];然后echo$entry else echo$entry fi done您可以使用dirname
和basename
拆分条目,如dirname=$(dirname“$entry”)
,然后pushd“$dirname”;重命名$rules“$basename”;popd
。